Hey guys.
I really hate to be this noobish. But I really want to get into the OpenGL Game, and I've been using MASM for a while now and I'd like to give it a shot. My problem is that when I run the program, I get a black screen. When I was programming in C++ this was due to glTranslatef not being able to go past 1.0f or -1.0f in the Z axis. But despite messing around with glTranslatef, I still get a black screen. Now I'm using Chrome, which handles all my includes and libraries for me, but I dont think it would affect the code. The drawing code I'm using is the Simple_Object.asm from the example archive.
Draw proc
invoke glClear, GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT
invoke glPushMatrix
invoke glTranslatef, CFLT(0.0), CFLT(0.0), CFLT(4.0)
invoke glRotatef, RotX, CFLT(0.0), CFLT(1.0), CFLT(0.0)
invoke glRotatef, RotY, CFLT(1.0), CFLT(0.0), CFLT(0.0)
invoke glRotatef, RotZ, CFLT(0.0), CFLT(0.0), CFLT(1.0)
invoke glBegin, GL_QUADS
invoke glColor3f, CFLT(0.0), CFLT(0.2), CFLT(0.3)
invoke glVertex3f, CFLT(1.0), CFLT(1.0), CFLT(-1.0)
invoke glVertex3f,CFLT(-1.0), CFLT(1.0), CFLT(-1.0)
invoke glVertex3f,CFLT(-1.0), CFLT(1.0), CFLT(1.0)
invoke glVertex3f, CFLT(1.0), CFLT(1.0), CFLT(1.0)
invoke glVertex3f, CFLT(1.0),CFLT(-1.0), CFLT(1.0)
invoke glVertex3f,CFLT(-1.0),CFLT(-1.0), CFLT(1.0)
invoke glVertex3f,CFLT(-1.0),CFLT(-1.0),CFLT(-1.0)
invoke glVertex3f, CFLT(1.0),CFLT(-1.0),CFLT(-1.0)
invoke glColor3f, CFLT(0.2), CFLT(0.4), CFLT(0.5)
invoke glVertex3f, CFLT(1.0), CFLT(1.0), CFLT(1.0)
invoke glVertex3f,CFLT(-1.0), CFLT(1.0), CFLT(1.0)
invoke glVertex3f,CFLT(-1.0),CFLT(-1.0), CFLT(1.0)
invoke glVertex3f, CFLT(1.0),CFLT(-1.0), CFLT(1.0)
invoke glVertex3f, CFLT(1.0),CFLT(-1.0),CFLT(-1.0)
invoke glVertex3f,CFLT(-1.0),CFLT(-1.0),CFLT(-1.0)
invoke glVertex3f,CFLT(-1.0), CFLT(1.0),CFLT(-1.0)
invoke glVertex3f, CFLT(1.0), CFLT(1.0),CFLT(-1.0)
invoke glColor3f, CFLT(0.4), CFLT(0.6), CFLT(0.7)
invoke glVertex3f, CFLT(-1.0), CFLT(1.0), CFLT(1.0)
invoke glVertex3f, CFLT(-1.0), CFLT(1.0),CFLT(-1.0)
invoke glVertex3f, CFLT(-1.0),CFLT(-1.0),CFLT(-1.0)
invoke glVertex3f, CFLT(-1.0),CFLT(-1.0), CFLT(1.0)
invoke glVertex3f, CFLT(1.0), CFLT(1.0),CFLT(-1.0)
invoke glVertex3f, CFLT(1.0),CFLT(1.0), CFLT(1.0)
invoke glVertex3f, CFLT(1.0),CFLT(-1.0), CFLT(1.0)
invoke glVertex3f, CFLT(1.0),CFLT(-1.0),CFLT(-1.0)
invoke glEnd
invoke glPopMatrix
ret
Draw endp
Any help you can provide would be greatly appreciated
If you can't translate beyond 1 unit, it's probably because you haven't called glDepthRange or gluLookAt or you've called glDepthRange or gluLookAt with bad numbers.
AFAICT, what you've got here is fine. :U
invoke glTranslatef, CFLT(0.0), CFLT(0.0), CFLT(4.0)
Contrary to directx you have to use negative z values in ogl due to the way the matrices are built, use CFLT(-4.0) instead.
Hi!
I'm a noobish too and I've got the same problem. I think, everything is ok in my code, I can change the background color, but I can't draw anything on it. Is it necessary to use gluLookAt function? At this moment I only would like to draw some simple prymitives without any complicated effects and methods.
Thanks for any help and advices
Show me your code.
...
...
...
k1 DWORD 1.0, 1.0, 1.0, 1.0
pkt1 DWORD 0.0,0.0,5.0
pkt2 DWORD 10.0,10.0,-10.0
pkt3 DWORD 10.0,0.0,-10.0
Value1Dbl dq 1.0
Value3Dbl dq 3.0
Value7Dbl dq 7.0
Value70Dbl dq 70.0
...
...
...
SetupRC proc
invoke glClearColor, DWORD PTR BackColor, DWORD PTR BackColor+4, DWORD PTR BackColor+8, DWORD PTR BackColor+12
invoke glEnable,GL_DEPTH_TEST
invoke glEnable,GL_LIGHTING
invoke glEnable,GL_CULL_FACE ; nie renderujemy powierzchni niewidocznych
invoke glShadeModel,GL_SMOOTH
invoke glEnable,GL_NORMALIZE
ret
SetupRC endp
ChangeSize PROC w:DWORD, h:DWORD
.if h==0
mov h,1
.endif
invoke glViewport, 0, 0, w, h
invoke glMatrixMode, GL_PROJECTION
invoke glLoadIdentity
invoke gluPerspective, DWORD PTR Value70Dbl, DWORD PTR Value70Dbl+4, DWORD PTR Value1Dbl, DWORD PTR Value1Dbl+4,
DWORD PTR Value3Dbl, DWORD PTR Value3Dbl+4, DWORD PTR Value7Dbl, DWORD PTR Value7Dbl+4
invoke glMatrixMode,GL_MODELVIEW
invoke glLoadIdentity
ret
ChangeSize endp
RenderScene proc
invoke glClear, GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT
invoke glPushMatrix
invoke glTranslatef, 0,0,-4
invoke glBegin, GL_TRIANGLES
invoke glColor3f, k1, k1+4, k1+8
invoke glVertex3f, pkt1, pkt1+4, pkt1+8
invoke glVertex3f, pkt2, pkt2+4, pkt2+8
invoke glVertex3f, pkt3, pkt3+4, pkt3+8
invoke glEnd
invoke glPopMatrix
invoke SwapBuffers,hDC
ret
RenderScene endp
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
local wc:WNDCLASSEX ;na stosie tworzymy zmienne lokalne
local msg:MSG
local Wwd:DWORD
local Wht:DWORD
local Wtx:DWORD
local Wty:DWORD
...
...
...
...
mov hWnd, eax
invoke ShowWindow, hWnd, CmdShow
invoke UpdateWindow, hWnd
call PetlaGlowna
ret
WinMain endp
PetlaGlowna proc
LOCAL msg:MSG
StartLoop:
invoke PeekMessage,ADDR msg,0,0,0,PM_NOREMOVE
or eax,eax
jz NoMsg
invoke GetMessage,ADDR msg,NULL,0,0
or eax,eax
jz ExitLoop
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
jmp StartLoop
NoMsg:
invoke RenderScene
jmp StartLoop
ExitLoop: mov eax,msg.wParam
ret
PetlaGlowna endp
Sorry for any polish comments;) If you want more (or even all) code, just tell me.
Thanks
Quote
invoke glTranslatef, 0,0,-4
Because masm doesn't convert arguments, -4 is an integer and glTranslatef awaits a floating point number, use:
Quote
ZPos real4 -4.0
invoke glTranslatef, 0,0,ZPos
You better dowload & use the stuff located here, it'll be much easier for you to use opengl with masm32:
http://www.masmforum.com/simple/index.php?topic=2522.0
Thanks for help, now everything is ok and works as it should :U
study
hi
I have got the same problem. I am noob and i can't draw. Please if you can, help me.
This is my macro:
fpc MACRO val:REQ
LOCAL w,x,y,z,zz,ww
;; split type and value, defaulting to REAL4
z INSTR 1,<&val>,<! >
IF z EQ 0
y TEXTEQU <REAL4>
x TEXTEQU <&val>
ELSE
y TEXTEQU @SubStr(<&val>,1,z-1) ;; Type
x TEXTEQU @SubStr(<&val>,z+1,) ;; Value
ENDIF
;; replace . with _
z INSTR 1,x,<!.>
IF z EQ 0
w TEXTEQU x
x CATSTR x,<.0> ;; prevent error message
ELSE
w CATSTR @SubStr(%x,1,z-1),<_>,@SubStr(%x,z+1,)
ENDIF
;; replace - with _
zz INSTR 1,w,<!->
IF zz EQ 0
ww TEXTEQU w
ELSE
ww CATSTR @SubStr(%w,1,zz-1),<_>,@SubStr(%w,zz+1,)
ENDIF
;; figure out global name for constant
z SIZESTR y ;; use last char for size distiction
ww CATSTR <__>,ww,<r>,@SubStr(%y,z,1)
IF (OPATTR(ww)) EQ 0 ;; not defined
CONST SEGMENT
ww y x
CONST ENDS
ENDIF
EXITM ww
ENDM
...
Vertex3f MACRO xx,yy,zz
push fpc(zz)
push fpc(yy)
push fpc(xx)
call glVertex3f
ENDM
and this is drawing code:
Rysunek:
invoke glClear,GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT
invoke glDisable,GL_LIGHTING
invoke glLoadIdentity
;pozx=x+8*sin(kat*pi180);
fld kat
fmul pi180
fsin
fmul o
fadd x
fstp pozx
;pozz=z+8*cos(kat*pi180)
fld kat
fmul pi180
fcos
fmul o
fadd z
fstp pozz
push dword ptr [oz+4]
push dword ptr [oz]
push dword ptr [oy+4]
push dword ptr [oy]
push dword ptr [ox+4]
push dword ptr [ox]
push dword ptr [pozz+4]
push dword ptr [pozz]
push dword ptr [pozy+4]
push dword ptr [pozy]
push dword ptr [pozx+4]
push dword ptr [pozx]
push dword ptr [z+4]
push dword ptr [z]
push dword ptr [y+4]
push dword ptr [y]
push dword ptr [x+4]
push dword ptr [x]
call gluLookAt
invoke glTranslatef,fpc(-1.5),fpc(0.0),fpc(-6.0)
invoke glBegin,GL_TRIANGLES
Vertex3f 0.0,1.0,0.0
Vertex3f -1.0,-1.0,0.0
Vertex3f 1.0,-1.0,0.0
invoke glEnd
ret
P.S. I have only fullscreen and i can change color.
Paste the values of the variables you're passing to glulookat.
o QWORD 8
x QWORD 15.0
y QWORD 0.8
z QWORD 15.0
pozx QWORD 0.0
pozy QWORD 0.0
pozz QWORD 0.0
ox QWORD 0.0
oy QWORD 1.0
oz QWORD 0.0
When I give
;gluLookAt
That doesn't chang. I have screen only but don't see tringles
As it seems several people have troubles to use glulookat i'll do an example about this one.
are u thinking that gllulookat in my program is wrong?
Yes.
if i delete glulookat, all are ok?
I added an example about gluLookAt in the archives (download both files).