Bonjour,
excusez s'il vous plaît mon mauvais français.
J'ai téléchargé à partir de la page "https://arkham46.developpez.com/articles/office/vbaopenglext/?page=page_4" l'exemple d'OpenGL pour les shaders en VB6 et adapté et étendu à mes besoins. Cela fonctionne à merveille.
Mais j'ai un problème avec le framebuffer.
Je crée un framebuffer avec la fonction suivante:
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 Private Sub InitFBO() glGenFramebuffersEXT 1, fbo glBindFramebufferEXT GL_FRAMEBUFFER_EXT, fbo glGenRenderbuffersEXT 1, depthbuffer glBindRenderbufferEXT GL_RENDERBUFFER_EXT, depthbuffer glRenderbufferStorageEXT GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, 512, 512 glFramebufferRenderbufferEXT GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthbuffer glGenTextures 1, tex glBindTexture GL_TEXTURE_2D, tex glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST glTexImage2D GL_TEXTURE_2D, 0, GL_RGBA8, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, ByVal 0 glFramebufferTexture2DEXT GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0 Debug.Print CheckFBO() glBindFramebufferEXT GL_FRAMEBUFFER_EXT, 0 End Sub Private Function CheckFBO() As String Dim FBOerror As Long FBOerror = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) Select Case FBOerror Case GL_FRAMEBUFFER_COMPLETE_EXT CheckFBO = "good" Case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT CheckFBO = "Incomplete attachment" Case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT CheckFBO = "Missing attachment" Case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT CheckFBO = "Incomplete dimensions" Case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT CheckFBO = "Incomplete formats" Case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT CheckFBO = "Incomplete draw buffer" Case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT CheckFBO = "Incomplete read buffer" Case GL_FRAMEBUFFER_UNSUPPORTED_EXT CheckFBO = "Framebufferobjects unsupported" Case Else CheckFBO = "poor" End Select End Function
La fonction retourne "good", donc tout va bien.
Ensuite, je veux dessiner dans le framebuffer la texture "tex" avec un shader, puis utiliser "tex" comme texture pour le second shader. Mais ça ne marche pas. Seule une image noire est affichée. Voici le code:
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 ' Rendu de la scène Public Sub Render() Dim u_Time As Long Dim u_Resolution As Long Dim geradezeit As Long Dim differenzLong As Long Dim differenzSingle As Single Dim teststring As String Dim u_Channel0 As Long glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT glBindFramebufferEXT GL_FRAMEBUFFER_EXT, fbo 'bind glPushAttrib GL_VIEWPORT_BIT glViewport 0, 0, 512, 512 glUseProgram BufferAProg glRectf -1#, -1#, 1#, 1# glClearColor 1, 0, 0, 0 teststring = "u_Time" teststring = StrConv(teststring, vbFromUnicode) u_Time = glGetUniformLocation(BufferAProg, StrPtr(teststring)) geradezeit = GetTickCount differenzLong = geradezeit - Startzeit differenzSingle = CSng(differenzLong / 1000) If iTime >= 0 Then glUniform1f u_Time, differenzSingle End If teststring = "u_Resolution" teststring = StrConv(teststring, vbFromUnicode) iResolution = glGetUniformLocation(BufferAProg, StrPtr(teststring)) If u_Resolution >= 0 Then glUniform3f u_Resolution, CSng(512), CSng(512), CSng(1) '640/360 End If glUseProgram 0& glPopAttrib glBindFramebufferEXT GL_FRAMEBUFFER_EXT, 0 glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT glPushAttrib GL_VIEWPORT_BIT glViewport 0, 0, 512, 512 glUseProgram GrundProg glRectf -1#, -1#, 1#, 1# teststring = "u_Time" teststring = StrConv(teststring, vbFromUnicode) u_Time = glGetUniformLocation(GrundProg, StrPtr(teststring)) geradezeit = GetTickCount differenzLong = geradezeit - Startzeit differenzSingle = CSng(differenzLong / 1000) If iTime >= 0 Then glUniform1f u_Time, differenzSingle End If teststring = "u_Resolution" teststring = StrConv(teststring, vbFromUnicode) u_Resolution = glGetUniformLocation(GrundProg, StrPtr(teststring)) If iResolution >= 0 Then glUniform3f u_Resolution, CSng(512), CSng(512), CSng(1) '640/360 End If teststring = "u_Channel0" teststring = StrConv(teststring, vbFromUnicode) u_Channel0 = glGetUniformLocation(GrundProg, StrPtr(teststring)) If u_Channel0 >= 0 Then glUniform1i u_Channel0, 0 glActiveTexture GL_TEXTURE0 glBindTexture GL_TEXTURE_2D, tex End If glUseProgram 0& glPopAttrib End Sub
Lorsque j'utilise les shaders individuels sans framebuffer, ils fonctionnent correctement et les autres textures des fichiers sont affichées correctement. Est-ce que quelqu'un peut m'aider sur le saut ??
Je suis débutant sous OpenGL et je ne connais pas grand chose. Je serais reconnaissant pour toute aide.
Alfred
Partager