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