Creation et utilisation d'un shader simpliste glsl avec masm et opengl

Description

le vertex shader ne fait rien de plus que le FFP de la carte graphique
(cad qu'il ne modifie pas de lui même la position des vertex)
le pixel shader force la couleur de sortie au vert en ignorant le
"invoke glcolor,rouge" du prog opengl.

rem: les fonctions glGetProgramivID,glGetShaderivID,glShaderSourceID
utilisent comme paramétres des pointeurs de pointeurs.


Bonne Prog.

Source / Exemple :


voici le bout de prog intéressant;

.data
	Name_glCreateShader BYTE "glCreateShader",0
	Name_glIsShader		BYTE "glIsShader",0
	Name_glDeleteShader	BYTE "glDeleteShader",0
	Name_glShaderSource	BYTE "glShaderSource",0
	Name_glCompileShader BYTE "glCompileShader",0
	Name_glGetShaderiv	BYTE "glGetShaderiv",0
	Name_glCreateProgram	BYTE "glCreateProgram",0
	Name_glDeleteProgram	BYTE "glDeleteProgram",0
	Name_glAttachShader		BYTE "glAttachShader",0
	Name_glLinkProgram		BYTE "glLinkProgram",0
	Name_glGetProgramiv		byte "glGetProgramiv",0
	Name_glUseProgram		BYTE "glUseProgram",0
	Name_glGetShaderInfoLog	BYTE "glGetShaderInfoLog",0
	ErrCompilPixelShader	BYTE "Erreur compilation du pixel shader",0
	ErrCompilVertexShader	byte "Erreur compilation du vertex shader",0
	
	
;un vertex shader qui ne fait rien de plus que le FFP
;-----------------------------------------------------
	
CodeSourceVertex_Shader	BYTE "void main(void)",0dh,0ah			
	      BYTE "{",0dh,0ah						
	      BYTE "gl_FrontColor = gl_Color;",0dh,0ah	
	      BYTE "gl_Position = ftransform();",0dh,0ah		
	      BYTE "}",0	
	
;un pixel shader qui définit le couleur de sortie des pixels à vert	;-------------------------------------------------------------------
	
CodeSourcePixel_Shader	BYTE "void main(void)",0dh,0ah			
	     BYTE "{",0dh,0ah						
	     BYTE "gl_FragColor = vec4(0.0,1.0,0.0,1.0);",0dh,0ah	
      BYTE"}",0								

.data?
	glCreateShaderID		dword ?	
	glIsShaderID			dword ? 
	glDeleteShaderID		dword ?	
	ID_vertex_shader		dword ?
	ID_pixel_shader			dword	?
	glShaderSourceID		dword	? 
	glGetShaderivID			dword	?
	glCompileShaderID		dword ?
	glCreateProgramID		dword	?
	glDeleteProgramID		dword	?
	glAttachShaderID		DWORD	?
	glLinkProgramID			dword	?
	glGetProgramivID		dword	?
	glUseProgramID			dword	?
	glGetShaderInfoLogID	DWORD ?
	Status					dword	?	
	program					dword ?	
	TailleMessErrCompile	dword	?
	StatusLinkage			dword ?
	PcodeSourceVertex_Shader	dword ?
	PCodeSourcePixel_Shader	dword ?
	IDbuffMessErr			dword ?
	
.code

;--------------
AffichScene	proc

		;obtention des pointeurs de fonctions
		;-----------------------------------
		
		invoke wglGetProcAddress,offset Name_glCreateShader
		mov glCreateShaderID,eax 
		invoke wglGetProcAddress,offset Name_glIsShader
		mov glIsShaderID,eax
		invoke wglGetProcAddress,offset Name_glDeleteShader
		mov glDeleteShaderID,eax
		invoke wglGetProcAddress,offset Name_glShaderSource
		mov glShaderSourceID,eax
		invoke wglGetProcAddress,offset Name_glCompileShader
		mov glCompileShaderID,eax
		invoke wglGetProcAddress,offset Name_glGetShaderiv
		mov glGetShaderivID,eax
		invoke wglGetProcAddress,offset Name_glCreateProgram
		mov glCreateProgramID,eax
		invoke wglGetProcAddress,offset Name_glDeleteProgram
		mov glDeleteProgramID,eax
		invoke wglGetProcAddress,offset Name_glAttachShader
		mov glAttachShaderID,eax
		invoke wglGetProcAddress,offset Name_glLinkProgram
		mov glLinkProgramID,eax
		invoke wglGetProcAddress,offset Name_glGetProgramiv
		mov glGetProgramivID,eax
		invoke wglGetProcAddress,offset Name_glUseProgram
		mov glUseProgramID,eax
		invoke wglGetProcAddress,offset Name_glGetShaderInfoLog
		mov glGetShaderInfoLogID,eax
		
		
		;obtention des ID des shaders 
		;----------------------------
				
		push GL_VERTEX_SHADER
		call glCreateShaderID
		mov ID_vertex_shader,eax
		
		push GL_FRAGMENT_SHADER 
		call glCreateShaderID
		mov ID_pixel_shader,eax
		
	;on remplit les objets 	ID_vertex_shader et ID_pixel_shader
	;avec leur code source respectifs	
	;-------------------------------
		
		push 0
		lea eax,CodeSourceVertex_Shader
		mov PcodeSourceVertex_Shader,eax
		lea eax,PcodeSourceVertex_Shader
		push eax 		;paramètre=double pointeur
		push 1
		push ID_vertex_shader
		call glShaderSourceID
		
		push 0
		lea eax,CodeSourcePixel_Shader
		mov PCodeSourcePixel_Shader,eax
		lea eax,PCodeSourcePixel_Shader
		push eax
		push 1
		push	ID_pixel_shader
		call glShaderSourceID	
		
		;on compile le shader
		;--------------------
		
		push ID_vertex_shader
		call glCompileShaderID
		
		push ID_pixel_shader
		call glCompileShaderID
		
		
		;verification du succes de la compilation
		;---------------------------------------
		
		mov eax,1
		mov Status,eax
		
		lea eax,Status
		push eax
		push GL_COMPILE_STATUS
		push	ID_vertex_shader
		call glGetShaderivID
		
		;récuperation du message d'erreur envoyé par openGL
		;lors de la compilation du vertex shader
		;--------------------------------
		
		cmp dword PTR[Status],1
		je @f
		
		invoke ERR,ID_vertex_shader,addr ErrCompilVertexShader
		@@:
		mov eax,1
		mov Status,eax
		
		lea eax,Status
		push eax
		push GL_COMPILE_STATUS
		push	ID_pixel_shader	
		call glGetShaderivID		
		
		;récuperation du message d'erreur envoyé par openGL
		;lors de la compilation du pixel shader
		;--------------------------------
		
		cmp dword PTR[Status],1
		je @f
		invoke ERR,ID_pixel_shader,addr ErrCompilPixelShader
		@@:	
		
		;---------------------
		;utilisation du shader
		;---------------------
		
			;1: creation du prog qui contiendra nos shaders
			;----------------------------------------------
			
			call glCreateProgramID
			mov program,eax
			
			;2:incorporation des nos shaders à notre prog
			;--------------------------------------------
			
			push ID_vertex_shader
			push program
			call glAttachShaderID
			
			push ID_pixel_shader
			push program
			call glAttachShaderID
			
;3:linkage du program=compilation des shaders contenu dans le prog
;---------------------------------
			
			push program
			call glLinkProgramID
			
			;4:on verifie si le linkage s'est bien passé
			;-----------------------------------------------
			
			lea eax,StatusLinkage
			push eax
			push GL_LINK_STATUS
			push	program
			call glGetProgramivID	;en retour StatusLinkage doit être=GL_TRUE (=1),à tester
			
;5:activation du program contenant les shaders
;(= désactivation du mode Fixed Function Pipeline de la carte graphique)			;---------------------------------------------------
			
			push program
			call glUseProgramID	;definit le prog de shaders actifs
			

;6:dessin de l'objet qui verra le rendu de chaqu'un de ses
;vertex traité par le shader			;-------------------------------------------------------
			
	;++++++++++++++++++++++++
	invoke glColor3f,P1,P0,P0	;cette ligne n'est pas prise en compte
				;car c'est le shader qui à la main et pas le FFP
	;++++++++++++++++++++++++
			
			invoke glBegin,GL_QUADS
				invoke glVertex3f,P0V5,P0,M0V5
				invoke glVertex3f,P0V5,P0V5,M0V5
				invoke glVertex3f,M0V5,P0V5,M0V5
				invoke glVertex3f,M0V5,P0,M0V5
			invoke glEnd

			;7:on repasse en mode FFP
			;----------------------
			push 0
			call glUseProgramID
			
			;8:on supprime le shader
			;---------------------
			push ID_vertex_shader
			call glDeleteShaderID
			
			push ID_pixel_shader
			call glDeleteShaderID
			
			;9:on supprime le prog
			;-------------------
			push program
			call glDeleteProgramID

	ret
		
	
AffichScene endp

ERR	proc	IDshr:dword,caption:dword
		
		;---------------------------------
		;récupérer le message d'erreur renvoye par opengl
		;lors de la compilation d'un shader
		;et l'affiche dans un messagebox
		;---------------------------------
		;IDshr=handle du shader
		;caption=pointeur sur le titre de la box
		;---------------------------------------
		
			;obtenir la taille du message d'erreur
			lea eax,TailleMessErrCompile
			push eax
			push GL_INFO_LOG_LENGTH
			push IDshr
			call glGetShaderivID
			;allouer la mémoire necessaire
			mov eax,TailleMessErrCompile
			inc eax	;+1 pour le caractere zero terminal
			invoke GlobalAlloc,GMEM_FIXED,eax
			mov IDbuffMessErr,eax
			;stocker le message d'erreur dans cette memoire
			push IDbuffMessErr
			lea eax,TailleMessErrCompile
			push eax
			mov eax,TailleMessErrCompile
			push eax
			push IDshr
			call glGetShaderInfoLogID
			;ajout du zero terminal
			mov eax,IDbuffMessErr
			add eax,TailleMessErrCompile
			mov dword ptr[eax],0
			;afficher le message d'erreur
			invoke MessageBox,0,IDbuffMessErr,caption,0
			;supprimer la mémoire allouée
			mov eax,IDbuffMessErr
			invoke GlobalFree,eax
	ret

ERR endp

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.