Bonsoir,

BUT:
Je travail actuellement sur mon moteur 3D qui supporte à la fois du Forward Shading et du Deferred Shading.
Problème:
J'ai deux pc sur lesquels j'effectue des testes:
-PC Portable avec un GPU Intel
-PC "fix" avec une GPU Nvidia GTX770 (driver: 372.54)
Le rendu en Forward Shading fonctionne sur les deux PC. Cependant le rendu en Deferred Shading ne fonctionne que sur le PC portable
et OpenGL (glGetError()) ne me donne aucune erreur.
La seul différence majeur entre ces deux techniques est l'utilisation des FBO donc je pense que le problème vient de là.


Initialisation du GBuffer:
Code : 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
//Génération des buffers
	glGenFramebuffers(1, &m_fbo);
	glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
	glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, m_width);
	glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, m_height);
	glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_SAMPLES, 0);
 
	//Générer les textures et les binds avec leur buffers
	//Diffuse
	glGenTextures(1, &m_textureDiffuse);
	glBindTexture(GL_TEXTURE_2D, m_textureDiffuse);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureDiffuse, 0);
	//Position
	glGenTextures(1, &m_texturePosition);
	glBindTexture(GL_TEXTURE_2D, m_texturePosition);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, NULL);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_texturePosition, 0);
	//Normal
	glGenTextures(1, &m_textureNormal);
	glBindTexture(GL_TEXTURE_2D, m_textureNormal);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, NULL);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, m_textureNormal, 0);
 
	//Depth
	glGenTextures(1, &m_depthtexture);
	glBindTexture(GL_TEXTURE_2D, m_depthtexture);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthtexture, 0);
 
	if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
		throw new std::exception("ERROR: Can't initialize the GBuffer");
 
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
Geometry Pass:
Code : 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
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
			glEnable(GL_TEXTURE_2D);
			glEnable(GL_DEPTH_TEST);
			glDepthFunc(GL_LESS);
 
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
			glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
			GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };
			glDrawBuffers(3, buffers);
 
			Mesh* mesh = m_staticmesh[i]->GetMesh();
			glm::mat4 trans = m_staticmesh[i]->GetTransform();
 
			glUniformMatrix4fv(glGetUniformLocation(DS_GeometryShader, "uModel"), 1, GL_FALSE, glm::value_ptr(trans));
			glUniformMatrix4fv(glGetUniformLocation(DS_GeometryShader, "uView"), 1, GL_FALSE, glm::value_ptr(m_activecamera->ViewMatrix()));
			glUniformMatrix4fv(glGetUniformLocation(DS_GeometryShader, "uProjection"), 1, GL_FALSE, glm::value_ptr(m_activecamera->ProjectionMatrix()));
 
			Material* material = m_staticmesh[i]->GetMaterial();
 
			//Use DiffuseMap or BaseColor
			if (material->useDiffuse && material->diffuse != NULL)
			{
				glUniform1i(glGetUniformLocation(DS_GeometryShader, "uUseDiffuseMap"), true);
 
				glActiveTexture(GL_TEXTURE0);
				glBindTexture(GL_TEXTURE_2D, material->diffuse->GetID());
				glUniform1i(glGetUniformLocation(DS_GeometryShader, "uDiffuseMap"), /*GL_TEXTURE*/ 0);
			}
			else
			{
				glUniform1i(glGetUniformLocation(DS_GeometryShader, "uUseDiffuseMap"), false);
				glUniform4fv(glGetUniformLocation(DS_GeometryShader, "uBaseColor"), 1, glm::value_ptr(material->baseColor));
			}
 
			glBindVertexArray(mesh->GetVAO());
			glDrawArrays(GL_TRIANGLES, 0, mesh->vertices.size());
			glBindVertexArray(0);
Shaders:
Geometry.fragment:
Code : 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
#version 400 core
 
layout(location = 0) out vec4 out_diffuse;
layout(location = 1) out vec4 out_position;
layout(location = 2) out vec4 out_normal;
 
in vec4 fFragPos;
in vec2 fUV;
in vec3 fNormal;
 
uniform bool uUseDiffuseMap;
uniform vec4 uBaseColor;
 
uniform sampler2D uDiffuseMap;
 
void main()
{
	if(uUseDiffuseMap)
	{
		out_diffuse = texture(uDiffuseMap, fUV);
	}
	else
	{
		out_diffuse = uBaseColor;
	}
 
	out_position = fFragPos;
	out_normal = vec4(fNormal.xyz, 1);
}
Je vous ai mis l'essentiel, si vous avez besoin de plus dites le moi
Merci !