# مباحث متفرقه برنامه نویسی > طراحی و ساخت بازی‌های کامپیوتری > سوال: Opengl در visual C++‎6

## sarakh

سلام دوستان
برای کار با opengl برای پروژه درس گرافیک VC++‎6 رو انتخاب کردم.برای ایجاد موتور گرافیکی مشکل پیدا کردم.
یه برنامه از سایت http://nehe.gamedev.net/data/lessons....asp?lesson=01 
برای vC++‎6 دانلود کردم و وقتی با vC++‎6 برنامه رو باز می کنم.اجرا می شه.حتی اگر بخوام جایی از برنامه رو تغییر بدم می شه و برای کامپایل هیچ پیغامی نمی ده.ولی اگر خودم بخوام یه موتور گرافیکی در vC++‎6 با استفاده از کد دانلود شده موجود در سایت ایجاد کنم,برنامه رو کامپایل نمی کنه و پیغام خطا می ده.
fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.حتی از قسمت project/setting سه تا فایل opengl32.lib glu32.lib glaux.lib رو لینک می کنم ولی باز هم پیغام می ده.
لطفا راهنماییم کنین.
سریعا به جواب نیاز دارم.

----------


## sarakh

البته ممکنه از همون اول پروژه رو در vC++‎6 اشتباه ایجاد کرده باشم.
پروژه رو بر اساس توضیحاتی که توی سایت http://nehe.gamedev.net/data/lessons....asp?lesson=01 بود ایجاد کردم.
مسیری که پیش رفتم:
file/new/win32 application
بعد از این قسمت می پرسه پروژه خالی ایجاد کنه؟یا دو تا گزینه دیگه که نمی دونم کذوم رو باید انتخاب کنم.
آدمی جایزالخطاست ممکنه جایی رو اشتباه پیش رفته باشم.
لطفا مراحل ایجاد پروژه جدید برای کار با opengl رو در vC++‎6 به طور کامل توضیح بدین.
ممنون.

----------


## ehp_kz6597

سلام
اگه روی vC++‎6 تاکیدی نیست لینک زیر میتونه کمکت کنه 
فیلم آموزش استفاده از  opengl  در Microsoft Visual Studio 2005

موفق باشید

----------


## 1485159

> ولی اگر خودم بخوام یه موتور گرافیکی در vC++‎6 با استفاده از کد دانلود شده موجود در سایت ایجاد کنم,برنامه رو کامپایل نمی کنه و پیغام خطا می ده.


جان؟ موتور گرافیکی؟ :لبخند گشاده!: 



> بعد از این قسمت می پرسه پروژه خالی ایجاد کنه؟


باید پروژه خالی ایجاد کنی. بعدن یک فایل .cpp ایجاد کن و کدت رو اونجا بنویسی و کامپایل کن. اولش شاید خیلی گیج بشی و کلا سر در گم ولی بعدا بهش عادت میکنی.
درضمن باید کتابخونه های opengl رو هم لینک کنی..

----------


## kochol

باید اول هر یک از فایل های ++c بنویسی

#include "stdafx.h"

----------


## 1485159

> باید اول هر یک از فایل های ++c بنویسی


برادر من چرا شایعه پراکنی میکنی؟ :لبخند گشاده!: 
من خودم که این کارو نمیکنم!!(البته نمیکردم، چون الان کلا برنامه نویسی نمیکنم)!

----------


## sarakh

منظور از موتور گرافیکی اینه که کدهای لازم رو برای ساخت پنجره گرافیکی در هر زبانی که دوست داریم ایجاد کنیم و بعد از  این کافیه هر شی که می خواهیم رسم می کنیم رو در یک تابع مخصوص که در موتور گرافیکی نوشته شده ایجاد کنیم.

----------


## sarakh

> جان؟ موتور گرافیکی؟
> باید پروژه خالی ایجاد کنی. بعدن یک فایل .cpp ایجاد کن و کدت رو اونجا بنویسی و کامپایل کن. اولش شاید خیلی گیج بشی و کلا سر در گم ولی بعدا بهش عادت میکنی.
> درضمن باید کتابخونه های opengl رو هم لینک کنی..


تا حالا با vC++‎6 کار نکردم و نمی دونم از چه طریقی فایل C++‎ رو ایجاد کنم.
لطفا راهنماییم کنین.ممنون

----------


## sarakh

> سلام
> اگه روی vC++‎6 تاکیدی نیست لینک زیر میتونه کمکت کنه 
> فیلم آموزش استفاده از opengl در Microsoft Visual Studio 2005
> 
> موفق باشید


این فایل رو دانلود کردم ولی با fash player7 که اجرا نشد.
با چی اجرا می شه؟؟؟؟؟؟؟؟
ورژن خاصی از flash player  رو نیاز داره؟؟؟

----------


## ehp_kz6597

سلام 
نه . فکر نکنم   :متفکر: 
اصلا  Internet Explorer  خیلی راحت وبدون مشکل فایل های فلاش رو پخش میکنه
اگه باز هم موفق نشدی این جزوه مختصر و خیـــــــــــــــــــلی مفید رو بخون . انشاء الله حل میشه 

OpenGLInCPP.pdf

موفق باشید

----------


## kochol

> برادر من چرا شایعه پراکنی میکنی؟
> من خودم که این کارو نمیکنم!!(البته نمیکردم، چون الان کلا برنامه نویسی نمیکنم)!


برو ببین precompiled header فایل چی هست چیزی نمی دونی اف تاپیک هم نده

----------


## 1485159

> چیزی نمی دونی اف تاپیک هم نده


شما استادی... :خجالت: 
من که هیچوقت نمینویسمش!

----------


## kochol

> شما استادی...
> من که هیچوقت نمینویسمش!


من ازت معذرت می خوام

----------


## sarakh

دوستان سلام لطفا جواب بدین.
تا حالا با vC++‎6 کار نکردم و نمی دونم بعد از اینکه پروژه خالی ایجاد کردم از چه طریقی باید فایل C++‎ رو ایجاد کنم.
لطفا راهنماییم کنین.ممنون .

----------


## kochol

می شه بگی چرا گیر دادی به وی سی 6؟
وی سی 6 خیلی قدیمیه

برو یه ویژوال استادیو دات نت 2005 یا 2010 بخر با اون کار کن. 2008 رو نخر چون باگ داره و کلی باید سرویس پک و غیره بریزی تا یه ذره بهتر بشه.

----------


## pswin.pooya

> برو یه ویژوال استادیو دات نت 2005 یا 2010 بخر با اون کار کن. 2008 رو نخر  چون باگ داره و کلی باید سرویس پک و غیره بریزی تا یه ذره بهتر بشه.


بیخیال ۲۰۱۰ هم شو. به شکل عجیبی کند هستش؟!!!‌(یا سیستم من تعطیله)‌ اگر به خاطر کامپایلر و MSVC نبود من حتی بهش نگاه هم نمی کردم.

----------


## kochol

> بیخیال ۲۰۱۰ هم شو. به شکل عجیبی کند هستش؟!!!‌(یا سیستم من تعطیله)‌ اگر به خاطر کامپایلر و MSVC نبود من حتی بهش نگاه هم نمی کردم.


اره کنده البته نه رو سیستم خفن من :D
فکر کنم دلیله اصلی کند بودنش اینه که همش داره تو کدت دنبال خطا می گرده عین سی شارپ و وی بی ولی فکر کنم بتونی این امکاناتشو خاموش کنی اونوقت سرعتش می ره بالا

----------


## pswin.pooya

اره کنده البته نه رو سیستم خفن من :D
فکر کنم دلیله اصلی کند بودنش اینه که همش داره تو کدت دنبال خطا می گرده  عین سی شارپ و وی بی ولی فکر کنم بتونی این امکاناتشو خاموش کنی اونوقت  سرعتش می ره بالا 						

من خاموشش کردم و یه مقدار بهتر شد اما بازم حال نمیده. به نظر من ادیتور ۲۰۰۸ به مراتب بهتره (با ویژوال گوجه). کلا اگر به خاطر کامپایلر و MFC نبود بیخیالش می شدم.

----------


## sarakh

بابا بالاخره که چی؟؟؟اگه کسی خواست با vC++‎6 کار کنه چی؟؟؟؟
من فعلا فقط برای پروژه پایانترم می خوام.اگه لطف کنین و جواب سوالمو بدین ممنون می شم.
تا حالا با vC++‎6 کار نکردم و نمی دونم بعد از اینکه پروژه خالی ایجاد کردم از چه طریقی باید فایل C++‎ رو ایجاد کنم.

----------


## sarakh

حالا که از vC++‎ 2005 تعریف کردین.اگر ممکنه آموزش opengl رو برای vC++‎2005 در اختیارمون بزارین.

دلیل اینکه به vC++‎6 گیر دادم این هست که برای vC++‎6 اطلاعات زیادی دارم و می تونم پروژه رو با این مطالبی که در اختیار دارم ایجاد کنم.منتظر جواب سوالاتم در مورد vC++‎6 هستم. :ناراحت:  :افسرده:  :گریه:

----------


## pswin.pooya

از لحاظ OpenGL ویژوال C++‎ شیش با 2005 و حتی GCC هیچ فرقی نمیکنه. فقط لازمه یک برنامه کنسول win32 ایجاد کنی و percompiled header رو داخل گزینه ها خاموش کنی و empty project رو انتخاب کنی. وبعد از ایجاد پروژه گزینه File->New->File یه فایل C++‎ درست کنی. و هدرهای زیر رو وارد کنی:

#include <GL/gl.h>
#include <GL/glut.h>

#pragmma comment (lib,"opengl32.lib")
#pragma comment(lib,"glut32.lib")

بعدش هم کدت رو تایپ کن. در مورد کپی کردن هدرها هم فقط کافیه یه سرچ توی سایت بزنی.

----------


## sarakh

سلام.از این فایل های dll,.lib,.h.   زیاد دانلود کردم.
اما نمی دونم چه فایل هایی رو برای کار با open gl در vb.net 2005 باید استفاده کنم؟؟؟؟؟؟؟؟
این فایل ها رو باید کجا ذخیره کنم تا به برنامه لینک بشه؟؟؟؟؟؟؟؟؟؟؟

----------


## sarakh

در کتابی خوندم که گفته بود این سه تا فایل باید در قسمت linker اضافه بشه.
Opengl32.lib glu32.lib glaux.lib
ولی نمی دونم به جز این فایل ها فایل دیگه ای نیاز هست یا نه؟؟؟؟؟؟؟؟؟
و این 3 فایل رو کجا باید ذخیره کنم که موقع کامپایل برنامه error نده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
لطفا راهنمایی کنید.

----------


## kochol

سلام 
از این فایل ها باید در سی ++ استفاده کنید و برای vb.net نیستند
این مقاله فکر کنم به دردتون بخوره
http://www.devmaster.net/articles/in...dev/part16.php

----------


## sarakh

[QUOTE=kochol;1204825]سلام 
از این فایل ها باید در سی ++ استفاده کنید و برای vb.net نیستند





ممنون 
من هم اون فایل هارو برای vC++‎2005 گفتم.
حالا درسته؟؟؟؟؟؟؟؟؟؟

----------


## sarakh

you must also remember to include the directory in the Projects and Solutions menu.

این رو توی مقاله ای که گفتین خوندم اما دقیقا نمی دونم چه جوری اون فایل رو توی پروژه یا قسمت solution اضافه کنم؟؟؟؟؟؟؟؟
من این کار رو انجام دادم :
روی اسم پروژه در پنجره solution راست کلیک می کنیم و گزینه references رو انتخاب می کنیم.بعد در قسمت references گزینه add path رو انتخاب می کنیم و مسیری که فایل های lib در اون ذخیره شده 
رو مشخص می کنیم.
درسته؟؟؟؟؟؟؟؟؟؟؟؟؟؟
اگر درست نیست لطفا تصحیح کنید در غیر این صورت درست بودنشو اطلاع بدین.
ممنون.

----------


## kochol

سلام
نه درست نیست.
این اموزش رو ببین توش توضیح دادم که چه طوری باید مسیر ها رو برای سرچ vs.net تعریف کنی
http://kge3d.org/document/tutorials/...piler-setup-2/
این قسمتی هست که شما نیاز دارید.
If your IDE is Visual Studio .NET ,  Select <Tools> menu and select <Options…>.Select the projects entry and then select <VC++‎ directories>. Select ‘show directories for include files’ in the combo box , and add “Include” Directories of KGE engine.
Compiler also need to find the library files of engine,so stay in that dialog , select ‘show directories for Library files’ and add the libs directory of engine and also add the “Debug” directory.

----------


## sarakh

ممنون از راهنماییتون.
اما هر کار کردم هیچ فایده ای نداشت.این کد رو توی برنامه دوشتم که اول تست کنم آیا همه چی درسته یا نه؟مثلا همین پیدا کردن فایل های include.
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <gl/glut.h>
#include <math.h>
int main ( int args , char  *argv [ ] ) 
{
	return 0 ;
}
مسیر پوشه include  رو برای libarary و includeو  reference  در قسمت  show directories for Library files مشخص کردم.
فایل های .dll رو در پوشه windows32 و فایل های .h و .lib رو در C:\Program Files\Microsoft Visual Studio 8\VC\include ذخیره کردم.
در قسمت linker هم Opengl32.lib glu32.lib glut32.lib glaux.lib freeglut.lib رو نوشتم.
با این حال این پیغام خطا رو دریافت می کنم:
fatal error c1083:can not open include file ‘gl/glut.h’:no such file or directory
لطفا راهنماییم کنین.

----------


## pswin.pooya

سلام

1. فایلهای .lib رو باید بریزی تو پوشه lib
2. فایلهای .h رو هم توی پوشه C:\Program Files\Microsoft Visual Studio 8\VC\include\gl\ باید بریزی

----------


## sarakh

مشکل فعلا حل شد فکر می کنم مسیر directories رو اشتباه وارد کرده بودم.
مسیر درست اینه:
glut32.dll -> C:\Windows\System or C:\WinNT\System
glut32.lib -> C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib
glut32.h -> C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\gl

مشکلم رو از طریق این سایت برطرف کردم.
مراحل ایجاد پروژه opengl رو با vC++‎2005 رو به خوبی و به طور کامل توضیح داده.
http://www.cecs.csulb.edu/~pnguyen/U...dio%202005.htm
البته برای تعیین کردن محل پوشه های lib و include باید از این لینک که در بالا هم قرار داده شده استفاده کنیم.
http://kge3d.org/document/tutorials/...piler-setup-2/

----------


## sarakh

سلام.
دوستان گفته بودن از نظرopengl ر vC++‎6  و vC++‎2005 با هم فرقی نداره.
برای همین من یه کد از سایت nehe دانلود کردم که برای vC++‎6 نوشته شده بود و کد رو در پروژه vC++‎2005کپی کردم.موقع اجرای برنامه حدود 23 تا پیغام خطا داره.رفع این خطاها وقت زیادی می خواد و فرصت من  زیاد نیست.
یه موتور گرافیکی(همون کدهایی که شامل تابع killwindow وdrawglscen و غیره هست) برای visual C++‎ 2005  نیاز دارم.
 :لبخند:

----------


## sarakh

دوستان لطفا موتور گرافیکی برای vC++‎2005
خیلی فرصت ندارم.

----------


## sarakh

سلام به راهنمایی دوستان تصمیم گرفتم با visual C++‎.net 2005 برنامه رو بنویسم.
کد رو از سایت http://nehe.gamedev.net/data/lessons....asp?lesson=03 دانلود کردم.
کد مربوط به visual studio.net ولی با این حال موقع اجرا 23 تا error و 2 تا warning دریافت کردم.
در این برنامه در قسمت linker این هارو قرار داده:opengl32.lib glu32.lib odbc32.lib odbccp32.lib    
البته نمی دونم این دو تا odbc32.lib odbccp32.lib برای چی استفاده شده.فایل .dll و .lib رو برای این دو فایل دارم ولی .h ندارم.
لطفا راهنمایی کنین که علت این پیام های خطا چی هست؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
اصلا کدوم کد رو دانلود کنم تا بتونم از طریق اون کدهای opengl رو برای vC++‎ اجرا کنم.(چون آموزش رو برای vC++‎ دارم)البته لازمه بگم با کد مربوط به vC++‎6 که در سایت nehe بود به جایی نرسیدم برای همین پیشنهاد شد با vC++‎2005 کار کنم.
یکی نیست راهنماییم کنه آخه عجله دارم. :گریه:

----------


## pswin.pooya

یه پروژه ساده که این همه دنگ و فنگ نداره. پیغام خطاها رو بگو تا بگیم مشکل از چیه.

----------


## sarakh

آخه چرا می زنین تو ذوقم.مگه تو عمرم چقدر با open gl کار کردم.من فقط چند تا pdf آموزش برای کار کردن با opengl دارم.که خودم باید کار با opengl رو شروع کنم بدون کمک استاد. :گریه: 
اگه اینجا هم کسی راهنمایی نکنه.استعداد های نهفته در من شکوفا نمی شه. :ناراحت: 
وقتی این برنامه رو با visual studio .net اجرا می کنم یه پنجره باز می شه که می گه باید کد رو convert کنه.بعد از تبدیل شدن کد اجرا میشه ولی بعد از اجرا شدن در قسمت output چند تا پیغام نوشته :
'lesson3.exe': Loaded 'E:\graphic\VC++‎\visual studio open gl\Debug\lesson3.exe', Symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\opengl32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\secur32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\user32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\glu32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\ddraw.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\dciman32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\imm32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\lpk.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\usp10.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\uxtheme.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\MSCTF.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\version.dll', No symbols loaded.
'lesson3.exe': Unloaded 'C:\WINDOWS\system32\version.dll'
'lesson3.exe': Loaded 'C:\WINDOWS\system32\MSCTFIME.IME', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\ole32.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\Program Files\Internet Download Manager\idmmkb.dll', Binary was not built with debug information.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\atioglxx.dll', No symbols loaded.
'lesson3.exe': Loaded 'C:\WINDOWS\system32\mcd32.dll', No symbols loaded.
'lesson3.exe': Unloaded 'C:\WINDOWS\system32\mcd32.dll'
The program '[2348] lesson3.exe: Native' has exited with code 0 (0x0).

حالا اگه همین کد رو توی پروژه ای که خودم شروع کردم به ایجاد کردنش کپی کنم 23 تا پیغام خطا داره.
Error	1	error C2061: syntax error : identifier 'keys'	e:\tc example\project heram\project ahraam\project ahraam\main.c	20	
Error	2	error C2059: syntax error : ';'	e:\tc example\project heram\project ahraam\project ahraam\main.c	20	
Error	3	error C3409: empty attribute block is not allowed	e:\tc example\project heram\project ahraam\project ahraam\main.c	20	
Error	4	error C2143: syntax error : missing ']' before 'constant'	e:\tc example\project heram\project ahraam\project ahraam\main.c	20	
Error	5	error C2061: syntax error : identifier 'active'	e:\tc example\project heram\project ahraam\project ahraam\main.c	21	
Error	6	error C2059: syntax error : ';'	e:\tc example\project heram\project ahraam\project ahraam\main.c	21	
Error	7	error C2513: '/*global*/ ' : no variable declared before '='	e:\tc example\project heram\project ahraam\project ahraam\main.c	21	
Error	8	error C2061: syntax error : identifier 'fullscreen'	e:\tc example\project heram\project ahraam\project ahraam\main.c	22	
Error	9	error C2059: syntax error : ';'	e:\tc example\project heram\project ahraam\project ahraam\main.c	22	
Error	10	error C2513: '/*global*/ ' : no variable declared before '='	e:\tc example\project heram\project ahraam\project ahraam\main.c	22	
Error	11	error C2065: 'fullscreen' : undeclared identifier	e:\tc example\project heram\project ahraam\project ahraam\main.c	82	
Error	12	error C2146: syntax error : missing ')' before identifier 'fullscreenflag'	e:\tc example\project heram\project ahraam\project ahraam\main.c	128	
Error	13	error C2081: 'bool' : name in formal parameter list illegal	e:\tc example\project heram\project ahraam\project ahraam\main.c	128	
Error	14	error C2061: syntax error : identifier 'fullscreenflag'	e:\tc example\project heram\project ahraam\project ahraam\main.c	128	
Error	15	error C2059: syntax error : ';'	e:\tc example\project heram\project ahraam\project ahraam\main.c	128	
Error	16	error C2059: syntax error : ')'	e:\tc example\project heram\project ahraam\project ahraam\main.c	128	
Error	17	error C2449: found '{' at file scope (missing function header?)	e:\tc example\project heram\project ahraam\project ahraam\main.c	129	
Error	18	error C2059: syntax error : '}'	e:\tc example\project heram\project ahraam\project ahraam\main.c	291	
Warning	19	warning C4013: 'CreateGLWindow' undefined; assuming extern returning int	e:\tc example\project heram\project ahraam\project ahraam\main.c	369	
Error	20	error C2065: 'active' : undeclared identifier	e:\tc example\project heram\project ahraam\project ahraam\main.c	391	
Error	21	error C2065: 'keys' : undeclared identifier	e:\tc example\project heram\project ahraam\project ahraam\main.c	391	
Error	22	error C2109: subscript requires array or pointer type	e:\tc example\project heram\project ahraam\project ahraam\main.c	391	
Error	23	error C2109: subscript requires array or pointer type	e:\tc example\project heram\project ahraam\project ahraam\main.c	400	
Error	24	error C2109: subscript requires array or pointer type	e:\tc example\project heram\project ahraam\project ahraam\main.c	402	
Warning	25	warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data	e:\tc example\project heram\project ahraam\project ahraam\main.c	416

----------


## sarakh

با سلام دوست عزیز,شما که می گین این پروژه ساده هست,بیا و در حق ما استادی کنین و کمک کنین که بتونم کار با opengl رو با visual C++‎2005.net شروع کنم. :لبخند: 
من مشکلم فقط همین توابع اولیه هست که برای تولید پنجره به کار می ره.مثل killwindow,drawglscene وچندتا تابع دیگه که بدون خطا در محیطی که می خوام  اجرا بشه و بتونم در اون شکل های مورد نظرم رو رسم کنم. 
پیشاپیش ممنون.

----------


## pswin.pooya

سلام
من تا حالا n تا برنامه gl نوشتم و تا حالا به همچین مشکلهایی بر نخوردم. واقعیتش رو بخوای کپی سورس اونم یه سورس قدیمی بیشتر از این نمیشه ولی من خیلی خوب یادمه که دو سال پیش همین مثالهای nehe رو داخل vs2005 کپی کردم و ازشون استفاده کردم. حالا واقعا نمی دونم مشکل شما کجاست فقط میتونم یه پیشنهاد بکنم و اونم اینه که به جای توابع ویندوز برای ایجاد پنجره از glut کمک بگیری.

نکته دیگه اینه داخل کدی که خودت پروژه رو ایجاد کردی متغییرهایی مثل key و یا fullscreen رو هم تعریف نکردی که واقعا فکر نکنم نتونی اونها رو اصلاح کنی در حقیقت من فکر میکنم که لقمه آماده میخوای که برای این مورد هم خیلی زیاده فقط همت گشتن میخواد

----------


## sarakh

مطمئن باشین دنبال لقمه آماده نیستم.این قدر توی سایت های جور واجور گشتم و  به جایی نرسیدم,که مجبور شدم بیام تو ی این سایت.
پروژه آماده نخواستم فقط یه کد به عنوان موتور گرافیکی می خوام که بتونم پروژمو شروع کنم.اون قدر هم فرصت و اطلاعات ندارم که خودم این کد هارو بنویسم.


و لازمه بگم متغیر های fullscreen و key هم تعریف شدن.از نوع boolean. ولی پیغام خطا داره.
میشه بگین دقیقا کدوم کد رو 2 سال پیش دانلود کردین و در vs2005 جواب داد؟؟؟؟؟؟؟؟

----------


## kochol

سلام
به نظرم کدت رو اینجا بذار یه نگاهی بهش بندازیم

----------


## sarakh

این کد رو از سایت nehe برای visual studio.net دانلود کردم.

/*
 *		This Code Was Created By Jeff Molofee 2000
 *		A HUGE Thanks To Fredric Echols For Cleaning Up
 *		And Optimizing The Base Code, Making It More Flexible!
 *		If You've Found This Code Useful, Please Let Me Know.
 *		Visit My Site At nehe.gamedev.net
 *		Conversion to Visual Studio.NET done by Grant James(ZEUS)
 */

#include <windows.h>		// Header File For Windows
#include <gl\gl.h>			// Header File For The OpenGL32 Library
#include <gl\glu.h>			// Header File For The GLu32 Library
#include <gl\glaux.h>		// Header File For The Glaux Library

HDC			hDC=NULL;		// Private GDI Device Context
HGLRC		hRC=NULL;		// Permanent Rendering Context
HWND		hWnd=NULL;		// Holds Our Window Handle
HINSTANCE	hInstance;		// Holds The Instance Of The Application

bool	keys[256];			// Array Used For The Keyboard Routine
bool	active=TRUE;		// Window Active Flag Set To TRUE By Default
bool	fullscreen=TRUE;	// Fullscreen Flag Set To Fullscreen Mode By Default

LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	// Declaration For WndProc

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)		// Resize And Initialize The GL Window
{
	if (height==0)										// Prevent A Divide By Zero By
	{
		height=1;										// Making Height Equal One
	}

	glViewport(0,0,width,height);						// Reset The Current Viewport

	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
	glLoadIdentity();									// Reset The Projection Matrix

	// Calculate The Aspect Ratio Of The Window
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	glMatrixMode(GL_MODELVIEW);							// Select The Modelview Matrix
	glLoadIdentity();									// Reset The Modelview Matrix
}

int InitGL(GLvoid)										// All Setup For OpenGL Goes Here
{
	glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// Black Background
	glClearDepth(1.0f);									// Depth Buffer Setup
	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
	return TRUE;										// Initialization Went OK
}

int DrawGLScene(GLvoid)									// Here's Where We Do All The Drawing
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer
	glLoadIdentity();									// Reset The Current Modelview Matrix
	glTranslatef(-1.5f,0.0f,-6.0f);						// Move Left 1.5 Units And Into The Screen 6.0
	glBegin(GL_TRIANGLES);								// Drawing Using Triangles
		glColor3f(1.0f,0.0f,0.0f);						// Set The Color To Red
		glVertex3f( 0.0f, 1.0f, 0.0f);					// Top
		glColor3f(0.0f,1.0f,0.0f);						// Set The Color To Green
		glVertex3f(-1.0f,-1.0f, 0.0f);					// Bottom Left
		glColor3f(0.0f,0.0f,1.0f);						// Set The Color To Blue
		glVertex3f( 1.0f,-1.0f, 0.0f);					// Bottom Right
	glEnd();											// Finished Drawing The Triangle
	glTranslatef(3.0f,0.0f,0.0f);						// Move Right 3 Units
	glColor3f(0.5f,0.5f,1.0f);							// Set The Color To Blue One Time Only
	glBegin(GL_QUADS);									// Draw A Quad
		glVertex3f(-1.0f, 1.0f, 0.0f);					// Top Left
		glVertex3f( 1.0f, 1.0f, 0.0f);					// Top Right
		glVertex3f( 1.0f,-1.0f, 0.0f);					// Bottom Right
		glVertex3f(-1.0f,-1.0f, 0.0f);					// Bottom Left
	glEnd();											// Done Drawing The Quad
	return TRUE;										// Keep Going
}

GLvoid KillGLWindow(GLvoid)								// Properly Kill The Window
{
	if (fullscreen)										// Are We In Fullscreen Mode?
	{
		ChangeDisplaySettings(NULL,0);					// If So Switch Back To The Desktop
		ShowCursor(TRUE);								// Show Mouse Pointer
	}

	if (hRC)											// Do We Have A Rendering Context?
	{
		if (!wglMakeCurrent(NULL,NULL))					// Are We Able To Release The DC And RC Contexts?
		{
			MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		}

		if (!wglDeleteContext(hRC))						// Are We Able To Delete The RC?
		{
			MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		}
		hRC=NULL;										// Set RC To NULL
	}

	if (hDC && !ReleaseDC(hWnd,hDC))					// Are We Able To Release The DC
	{
		MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hDC=NULL;										// Set DC To NULL
	}

	if (hWnd && !DestroyWindow(hWnd))					// Are We Able To Destroy The Window?
	{
		MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hWnd=NULL;										// Set hWnd To NULL
	}

	if (!UnregisterClass("OpenGL",hInstance))			// Are We Able To Unregister Class
	{
		MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hInstance=NULL;									// Set hInstance To NULL
	}
}

/*	This Code Creates Our OpenGL Window.  Parameters Are:					*
 *	title			- Title To Appear At The Top Of The Window				*
 *	width			- Width Of The GL Window Or Fullscreen Mode				*
 *	height			- Height Of The GL Window Or Fullscreen Mode			*
 *	bits			- Number Of Bits To Use For Color (8/16/24/32)			*
 *	fullscreenflag	- Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)	*/
 
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
	GLuint		PixelFormat;			// Holds The Results After Searching For A Match
	WNDCLASS	wc;						// Windows Class Structure
	DWORD		dwExStyle;				// Window Extended Style
	DWORD		dwStyle;				// Window Style
	RECT		WindowRect;				// Grabs Rectangle Upper Left / Lower Right Values
	WindowRect.left=(long)0;			// Set Left Value To 0
	WindowRect.right=(long)width;		// Set Right Value To Requested Width
	WindowRect.top=(long)0;				// Set Top Value To 0
	WindowRect.bottom=(long)height;		// Set Bottom Value To Requested Height

	fullscreen=fullscreenflag;			// Set The Global Fullscreen Flag

	hInstance			= GetModuleHandle(NULL);				// Grab An Instance For Our Window
	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	// Redraw On Size, And Own DC For Window.
	wc.lpfnWndProc		= (WNDPROC) WndProc;					// WndProc Handles Messages
	wc.cbClsExtra		= 0;									// No Extra Window Data
	wc.cbWndExtra		= 0;									// No Extra Window Data
	wc.hInstance		= hInstance;							// Set The Instance
	wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);			// Load The Default Icon
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			// Load The Arrow Pointer
	wc.hbrBackground	= NULL;									// No Background Required For GL
	wc.lpszMenuName		= NULL;									// We Don't Want A Menu
	wc.lpszClassName	= "OpenGL";								// Set The Class Name

	if (!RegisterClass(&wc))									// Attempt To Register The Window Class
	{
		MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;											// Return FALSE
	}
	
	if (fullscreen)												// Attempt Fullscreen Mode?
	{
		DEVMODE dmScreenSettings;								// Device Mode
		memset(&dmScreenSettings,0,sizeof(dmScreenSettings  ));	// Makes Sure Memory's Cleared
		dmScreenSettings.dmSize=sizeof(dmScreenSettings);		// Size Of The Devmode Structure
		dmScreenSettings.dmPelsWidth	= width;				// Selected Screen Width
		dmScreenSettings.dmPelsHeight	= height;				// Selected Screen Height
		dmScreenSettings.dmBitsPerPel	= bits;					// Selected Bits Per Pixel
		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWID  TH|DM_PELSHEIGHT;

		// Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
		if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLS  CREEN)!=DISP_CHANGE_SUCCESSFUL)
		{
			// If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
			if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
			{
				fullscreen=FALSE;		// Windowed Mode Selected.  Fullscreen = FALSE
			}
			else
			{
				// Pop Up A Message Box Letting User Know The Program Is Closing.
				MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
				return FALSE;									// Return FALSE
			}
		}
	}

	if (fullscreen)												// Are We Still In Fullscreen Mode?
	{
		dwExStyle=WS_EX_APPWINDOW;								// Window Extended Style
		dwStyle=WS_POPUP;										// Windows Style
		ShowCursor(FALSE);										// Hide Mouse Pointer
	}
	else
	{
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// Window Extended Style
		dwStyle=WS_OVERLAPPEDWINDOW;							// Windows Style
	}

	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		// Adjust Window To True Requested Size

	// Create The Window
	if (!(hWnd=CreateWindowEx(	dwExStyle,							// Extended Style For The Window
								"OpenGL",							// Class Name
								title,								// Window Title
								dwStyle |							// Defined Window Style
								WS_CLIPSIBLINGS |					// Required Window Style
								WS_CLIPCHILDREN,					// Required Window Style
								0, 0,								// Window Position
								WindowRect.right-WindowRect.left,	// Calculate Window Width
								WindowRect.bottom-WindowRect.top,	// Calculate Window Height
								NULL,								// No Parent Window
								NULL,								// No Menu
								hInstance,							// Instance
								NULL)))								// Dont Pass Anything To WM_CREATE
	{
		KillGLWindow();								// Reset The Display
		MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	static	PIXELFORMATDESCRIPTOR pfd=				// pfd Tells Windows How We Want Things To Be
	{
		sizeof(PIXELFORMATDESCRIPTOR),				// Size Of This Pixel Format Descriptor
		1,											// Version Number
		PFD_DRAW_TO_WINDOW |						// Format Must Support Window
		PFD_SUPPORT_OPENGL |						// Format Must Support OpenGL
		PFD_DOUBLEBUFFER,							// Must Support Double Buffering
		PFD_TYPE_RGBA,								// Request An RGBA Format
		bits,										// Select Our Color Depth
		0, 0, 0, 0, 0, 0,							// Color Bits Ignored
		0,											// No Alpha Buffer
		0,											// Shift Bit Ignored
		0,											// No Accumulation Buffer
		0, 0, 0, 0,									// Accumulation Bits Ignored
		16,											// 16Bit Z-Buffer (Depth Buffer)  
		0,											// No Stencil Buffer
		0,											// No Auxiliary Buffer
		PFD_MAIN_PLANE,								// Main Drawing Layer
		0,											// Reserved
		0, 0, 0										// Layer Masks Ignored
	};
	
	if (!(hDC=GetDC(hWnd)))							// Did We Get A Device Context?
	{
		KillGLWindow();								// Reset The Display
		MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))	// Did Windows Find A Matching Pixel Format?
	{
		KillGLWindow();								// Reset The Display
		MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	if(!SetPixelFormat(hDC,PixelFormat,&pfd))		// Are We Able To Set The Pixel Format?
	{
		KillGLWindow();								// Reset The Display
		MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	if (!(hRC=wglCreateContext(hDC)))				// Are We Able To Get A Rendering Context?
	{
		KillGLWindow();								// Reset The Display
		MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	if(!wglMakeCurrent(hDC,hRC))					// Try To Activate The Rendering Context
	{
		KillGLWindow();								// Reset The Display
		MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	ShowWindow(hWnd,SW_SHOW);						// Show The Window
	SetForegroundWindow(hWnd);						// Slightly Higher Priority
	SetFocus(hWnd);									// Sets Keyboard Focus To The Window
	ReSizeGLScene(width, height);					// Set Up Our Perspective GL Screen

	if (!InitGL())									// Initialize Our Newly Created GL Window
	{
		KillGLWindow();								// Reset The Display
		MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	return TRUE;									// Success
}

LRESULT CALLBACK WndProc(	HWND	hWnd,			// Handle For This Window
							UINT	uMsg,			// Message For This Window
							WPARAM	wParam,			// Additional Message Information
							LPARAM	lParam)			// Additional Message Information
{
	switch (uMsg)									// Check For Windows Messages
	{
		case WM_ACTIVATE:							// Watch For Window Activate Message
		{
			if (!HIWORD(wParam))					// Check Minimization State
			{
				active=TRUE;						// Program Is Active
			}
			else
			{
				active=FALSE;						// Program Is No Longer Active
			}

			return 0;								// Return To The Message Loop
		}

		case WM_SYSCOMMAND:							// Intercept System Commands
		{
			switch (wParam)							// Check System Calls
			{
				case SC_SCREENSAVE:					// Screensaver Trying To Start?
				case SC_MONITORPOWER:				// Monitor Trying To Enter Powersave?
				return 0;							// Prevent From Happening
			}
			break;									// Exit
		}

		case WM_CLOSE:								// Did We Receive A Close Message?
		{
			PostQuitMessage(0);						// Send A Quit Message
			return 0;								// Jump Back
		}

		case WM_KEYDOWN:							// Is A Key Being Held Down?
		{
			keys[wParam] = TRUE;					// If So, Mark It As TRUE
			return 0;								// Jump Back
		}

		case WM_KEYUP:								// Has A Key Been Released?
		{
			keys[wParam] = FALSE;					// If So, Mark It As FALSE
			return 0;								// Jump Back
		}

		case WM_SIZE:								// Resize The OpenGL Window
		{
			ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
			return 0;								// Jump Back
		}
	}

	// Pass All Unhandled Messages To DefWindowProc
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI WinMain(	HINSTANCE	hInstance,			// Instance
					HINSTANCE	hPrevInstance,		// Previous Instance
					LPSTR		lpCmdLine,			// Command Line Parameters
					int			nCmdShow)			// Window Show State
{
	MSG		msg;									// Windows Message Structure
	BOOL	done=FALSE;								// Bool Variable To Exit Loop

	// Ask The User Which Screen Mode They Prefer
	if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
	{
		fullscreen=FALSE;							// Windowed Mode
	}

	// Create Our OpenGL Window
	if (!CreateGLWindow("NeHe's Color Tutorial",640,480,16,fullscreen))
	{
		return 0;									// Quit If Window Was Not Created
	}

	while(!done)									// Loop That Runs While done=FALSE
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))	// Is There A Message Waiting?
		{
			if (msg.message==WM_QUIT)				// Have We Received A Quit Message?
			{
				done=TRUE;							// If So done=TRUE
			}
			else									// If Not, Deal With Window Messages
			{
				TranslateMessage(&msg);				// Translate The Message
				DispatchMessage(&msg);				// Dispatch The Message
			}
		}
		else										// If There Are No Messages
		{
			// Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
			if ((active && !DrawGLScene()) || keys[VK_ESCAPE])	// Active?  Was There A Quit Received?
			{
				done=TRUE;							// ESC or DrawGLScene Signalled A Quit
			}
			else									// Not Time To Quit, Update Screen
			{
				SwapBuffers(hDC);					// Swap Buffers (Double Buffering)
			}

			if (keys[VK_F1])						// Is F1 Being Pressed?
			{
				keys[VK_F1]=FALSE;					// If So Make Key FALSE
				KillGLWindow();						// Kill Our Current Window
				fullscreen=!fullscreen;				// Toggle Fullscreen / Windowed Mode
				// Recreate Our OpenGL Window
				if (!CreateGLWindow("NeHe's Color Tutorial",640,480,16,fullscreen))
				{
					return 0;						// Quit If Window Was Not Created
				}
			}
		}
	}

	// Shutdown
	KillGLWindow();									// Kill The Window
	return (msg.wParam);							// Exit The Program
}

----------


## sarakh

سلام بالاخره تونستم کد رو برای vC++‎6 اجرا کنم.نمی دونم تا قبل کجا اشتباه می کردم.ولی این چند مورد رو انجام دادم تا جواب داد.
1- در vC++‎6 یه پروژه از نوع win32 application ایجاد کردم و empty project رو انتخاب کردم.
2- یه کلاس جدید ایجاد کردم.
3-دوتا زیر شاخه یکی برای .h و .cpp ایجاد شد که اینارو delete کردم. :لبخند: 
4-روی کلاس که ایجاد کرده بودم دابل کلیک کردم و کدشو پاک کرم به جای اون کد,کد مربوط به موتور گرافیکی رو paste کردم.
5-در project\setting\linke این رو (OpenGL32.lib GLu32.lib GLaux.lib)قبل از kernel32  نوشتم.
6-این 3 فایل رو در مسیر مشخص شده قرار دادم.البته مسیرهای توی سیستمم کمی فرق داشت.ولی اصل lib و includ\gl  هست که داشتم.
copy glut.h to C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl
(if you have a X86 base Processor) copy glut32.dll & glut32.lib to C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
(if you have a X64 base Processor) copy glut32.dll & glut32.lib to C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64
7-build\buil project.exe رو اجرا کردم.
8-برنامه رو اجرا کردم.

برنامه اجرا می شه.ولی اگر بخوام compile کنم پیغام خطا می ده به خاطر اینکه قبلا h.وcpp. رو پاک کردم.
با vC++‎6 کار نکردم.راهنماییم کنین چکار کنم که بتونم بدون پاک کردن  h.وcpp. کد رو به پروژه اضافه کنم؟؟؟؟؟؟؟؟؟؟

----------


## sarakh

درست شد.نیازی نیست h.وcpp. رو پاک کنیم.کد رو در قسمت مربوط به cpp. اضافه کردم. 
حالا کاملا جواب می ده.

----------


## amin1softco

بعضی وقتا بعضی کارا الکی گیر می کنه تمام مثال های nehe رو می شه با vc6 باز کرد
file -> workspace


کل مثال رو بریزید در یک فولدر و اینجوری بازش کنید بدن هیچ دنگ وفنگی :لبخند گشاده!:  باز می شه :بوس:

----------


## sarakh

سلام 
برای بافت گذاری روی یه هرم این پیغام خطا رو دریافت می کنم.
initialization failed
می شه بگین دلیلش چیه؟؟؟؟؟؟؟؟؟
واسه این,خیلییی خیلییییییی عجله دارم.
در ضمن آدرس عکس مورد نظرم رو اینجوری وارد کردم.درسته؟؟؟؟؟؟؟

if (TextureImage[0] = LoadBMP( "C:\pic.bmp" ) )

----------


## kochol

> سلام 
> برای بافت گذاری روی یه هرم این پیغام خطا رو دریافت می کنم.
> initialization failed
> می شه بگین دلیلش چیه؟؟؟؟؟؟؟؟؟
> واسه این,خیلییی خیلییییییی عجله دارم.
> در ضمن آدرس عکس مورد نظرم رو اینجوری وارد کردم.درسته؟؟؟؟؟؟؟
> 
> if (TextureImage[0] = LoadBMP( "C:\pic.bmp" ) )


سلام

نه باید اینطوری بگی به جای یه \ باید \\ بذاری یا /
"C:\\pic.bmp"

----------


## sarakh

سلام 
این تابع برای نورپردازی استفاده شده ولی نمی دونم مقادیر رو بر چه اساسی وارد کرده؟؟؟؟
لطفا راهنماییم کنین.
glNormal3f( 0.0f, 0.0f,-1.0f);

----------


## kochol

سلام
این ها بردار های عمود بر سطح مثلث است که برای نور پردازی استفاده می شه

----------


## sarakh

بر چه اساسی مقدار صفر یا یک یا منفی یک می گیره؟؟؟؟؟؟؟؟؟

----------


## kochol

یعنی بردار عمود بر سطح رو شما نمی دونید چی هست؟
یا اینکه روش محاسبه بردار normal رو می خواهید بدونید؟

----------

