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
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.