Подскажите кто может. Есть такой код, всё работает, только не так как надо. Код (Text): format PE GUI 4.0 entry start include 'g:\fasm\include\win32a.inc' include 'g:\fasm\include\OPENGL.inc' ;include 'g:\fasm\include\opengl_macros.inc' ;include 'g:\fasm\include\opengl_const.inc' section '.data' data readable writeable wHMain dd ? wHInstance dd ? wTitle db 'Tutorial 3',0 ;name of our window wClsName db 'TUT03',0 ;name of our window class wMsg MSG wCls WNDCLASS pfd PIXELFORMATDESCRIPTOR <> g_hDC dd 0 g_hRC dd 0 PixelFormat dd 0 theta dd 0 delta dd 0.1 section '.code' code readable executable start: ;*********************** invoke GetModuleHandle,NULL mov [wHInstance],eax mov [wCls.hInstance],eax mov [wCls.style],CS_HREDRAW or CS_VREDRAW mov [wCls.lpfnWndProc],window_procedure mov [wCls.lpszClassName],wClsName mov [wCls.hbrBackground],COLOR_WINDOW+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wCls.hCursor],eax invoke RegisterClass,wCls ;*********************** invoke CreateWindowEx,\ 0,\ wClsName,\ wTitle,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ [wHInstance],\ NULL mov [wHMain],eax ;*********************** call InitOpenGL ;*********************** invoke ShowWindow,[wHMain],SW_SHOW ;*********************** window_message_loop_start: invoke PeekMessage, wMsg,NULL,0,0,PM_REMOVE cmp eax,1 jnz __render cmp [wMsg.message], WM_QUIT jz window_message_loop_end ;je window_message_loop_end invoke TranslateMessage,wMsg invoke DispatchMessage,wMsg jmp window_message_loop_start __render: call Render jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;*************************** ; ;*************************** proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi ;eventhough the API would preserved, but play safe :p cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx ret endp ;*********************** ;Рендер сцены ;*********************** Render: invoke glClear,GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT invoke glClearColor,1.0f, 0.0f, 0.0f, 0.0f invoke glLoadIdentity ;invoke gluLookAt, 0.0,0.0f, 0.0,-1.0f, 0.0,-1.0f,\ ; 0.0,0.0f, 0.0,-2.0f, 0.0,1.0f,\ ; 0.0,0.0f, 0.0,1.0f, 0.0,0.0f invoke glTranslatef,0.0f,0.0f, -25.0f invoke glRotatef,[theta],0.0,0.0,1.0 fld [theta] fadd [delta] fstp [theta] invoke glBegin,GL_TRIANGLES invoke glColor3f,0.0,1.0,1.0 invoke glVertex3f, -0.5, -0.5, -1.0 invoke glColor3f,1.0,1.0,0.0 invoke glVertex3f, 0.5, -0.5, -1.0 invoke glColor3f,0.0,1.0,1.0 invoke glVertex3f, 0.5, 0.5, -1.0 invoke glEnd invoke SwapBuffers,[g_hDC] ret InitOpenGL: mov [pfd.nSize],sizeof.PIXELFORMATDESCRIPTOR mov [pfd.nVersion],1 mov [pfd.dwFlags],PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER mov [pfd.iPixelType],PFD_TYPE_RGBA mov [pfd.cColorBits],32 mov [pfd.cRedBits],0 mov [pfd.cRedShift],0 mov [pfd.cGreenBits],0 mov [pfd.cGreenShift],0 mov [pfd.cBlueBits],0 mov [pfd.cBlueShift],0 mov [pfd.cAlphaBits],0 mov [pfd.cAlphaShift],0 mov [pfd.cAccumBits],0 mov [pfd.cAccumRedBits],0 mov [pfd.cAccumGreenBits],0 mov [pfd.cAccumBlueBits],0 mov [pfd.cAccumAlphaBits],0 mov [pfd.cDepthBits],16 mov [pfd.cStencilBits],0 mov [pfd.cAuxBuffers],0 mov [pfd.iLayerType],PFD_MAIN_PLANE mov [pfd.bReserved],0 mov [pfd.dwLayerMask],0 mov [pfd.dwVisibleMask],0 mov [pfd.dwDamageMask],0 invoke GetDC,[wHMain] mov [g_hDC],eax invoke ChoosePixelFormat,[g_hDC],pfd mov [PixelFormat],eax invoke SetPixelFormat,[g_hDC],[PixelFormat],pfd invoke wglCreateContext,[g_hDC] mov [g_hRC],eax invoke wglMakeCurrent,[g_hDC],[g_hRC] invoke glShadeModel,GL_SMOOTH ;invoke glClearDepth,1.0f invoke glEnable,GL_DEPTH_TEST ;invoke glDepthFunc,GL_LESS invoke glClearColor,0,0,0,0 invoke glHint,GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST invoke glViewport,0,0,800,600 invoke glMatrixMode,GL_PROJECTION ;invoke glLoadIdentity invoke gluPerspective,0,45.0f,0,1.0f,0,0.1f,0,100.0f ;glcall gluPerspective,90.0,ratio,0.1,100.0 ;invoke gluPerspective,45.0f,1.0f,1.0f,100.0f invoke glMatrixMode,GL_MODELVIEW ;invoke glLoadIdentity ret В результате получается наверное треугольник, но слишком растянутый какой то. Хотя должен быть нормальным с координатами: Код (Text): invoke glVertex3f, -0.5, -0.5, -1.0 invoke glVertex3f, 0.5, -0.5, -1.0 invoke glVertex3f, 0.5, 0.5, -1.0
В результате создается окно неправильного размера (не квадратное)... Затем, это окно нормируется в соответствии с кодом инициализации OpenGL, и естественно, получаем искажения. Более того, задает вытянутый по Х вьюпорт (что в общем случае немного не то, что хотелось бы. В идеале, надо читать текущие размеры окна, и делать вьюпорт соответствующих размеров. А потом вычислять соотношение сторон, и изменять масштаб, чтобы избежать искажения) Попробуй четко задать размер окна, чтоб получить одинаковую размерность по X и Y (естественно, учитывая, что некоторая часть по Y у окна отводится под системный заголовок). Вот тогда треугольник будет правильным. Вопрос на воображение: что будет, если мышкой изменять границы окна с изображенным примитивом? )) То есть, чтоб совсем было понятно, надо делать как-то так: Код (Text): LOCAL rc:RECT ... invoke wglMakeCurrent,[hdc],eax invoke GetClientRect,[hWnd],addr rc затем Код (Text): mov eax, [rc.right] mov edx, [rc.bottom] invoke glViewport,0,0,eax,edx А при смене размеров окна, ловить WM_SIZE и опять менять вьюпорт в соответствии с новыми размерами, и перерисовывать сцену (иначе уменьшение размеров оставит нам для просмотра только верхний левый угол, а увеличение оставит кусок незадействованного пространства - неэстетично!). Чтобы избежать искажений на прямоугольном окне, можно после glLoadIdentity поделить размер окна по X на размер по Y (FPU! что естественно...), и выставить glScale с правильными параметрами. Или заранее (в обучающих целях, чтоб не возится с FPU) создавать окно почти квадратного размера, а вьюпорт задавать как 0,0, MIN([rc.bottom],[rc.right]), MIN([rc.bottom],[rc.right])