Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL中的延迟着色?_C++_Opengl_Rendering_Deferred - Fatal编程技术网

C++ OpenGL中的延迟着色?

C++ OpenGL中的延迟着色?,c++,opengl,rendering,deferred,C++,Opengl,Rendering,Deferred,我的延迟着色实现有一个奇怪的问题。 我通过MRT将所需信息渲染到FBO中,当前为世界空间中的漫反射、位置和法线,如下所示: 这是通过以下所有树纹理的设置完成的: diffuse = std::shared_ptr<bb::Texture>(new bb::Texture(GL_TEXTURE_2D)); // generates texture ID diffuse->bind(); diffuse->texture2D(0, GL_RGB, width, height

我的延迟着色实现有一个奇怪的问题。 我通过MRT将所需信息渲染到FBO中,当前为世界空间中的漫反射、位置和法线,如下所示:

这是通过以下所有树纹理的设置完成的:

diffuse = std::shared_ptr<bb::Texture>(new bb::Texture(GL_TEXTURE_2D)); // generates texture ID
diffuse->bind();
diffuse->texture2D(0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, 0); // glTexture2D
diffuse->parameterf(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
diffuse->parameterf(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
diffuse->parameterf(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
diffuse->parameterf(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
diffuse->unbind();
texture2D(GL_COLOR_ATTACHMENT0+1, diffuse->getID(), 0);
使用以下着色器(只是必要的部分,光源是硬编码的):

wierd部分是,如果我将光源方向设置为负值,那么假设:

DirLight light0 = DirLight(vec3(-1, 0, 0), vec4(0.3), vec4(0.1));
最终结果未着色。它看起来适合正值(或多或少)。 以下是输出的图片:


在红色区域标记的法线也可能有问题。

好的,Andon M.Coleman的解决方案,我将内部格式切换为GL_RGB8_SNORM。
谢谢你的帮助:)

听起来你的正常状态有问题。你试过在没有延迟着色的情况下渲染场景吗?是的,我试过了,没问题。您可以在第一张图片中看到所有树纹理的输出。我忘了提到的是,我的z轴是上轴,看起来你的法线是颠倒的,在第一个轴上。我建议先尝试解决这个问题,然后再回来测试负值。正常的G缓冲区的格式是什么?在附加的屏幕截图中,您忽略了将法线缩放和偏移到可见颜色范围中。。。也就是说,当在默认帧缓冲区上显示为黑色时,任何具有负值的法线都会被GL剪裁。如果您试图以
GL\u RGB
等格式存储法线,则G缓冲区本身也有此行为。你可以使用诸如<代码> GLY-RGB88SAMNOR/<代码>或者做旧的代码> * 0.5 + 0.5 < /C>,手动缩放到[0,1]和<代码> * 2 - 1 /代码>技巧,以缩回[-1,1]。这是给评论者的一个提示:这实际上是一个答案,而不是一个“谢谢”。目前没有针对此问题发布的其他答案。答案是在问题评论中提出的,OP在这里对其进行了有益的总结@用户3476897:如果Andon决定发布答案,建议他接受他的答案。
struct DirLight{
    vec3 direction;
    vec4 diffuse, specular;
};

uniform sampler2D diffuse;
uniform sampler2D position;
uniform sampler2D normal;

uniform vec3 camera;

DirLight light0 = DirLight(vec3(1, 1, 0), vec4(0.3), vec4(0.1));

in vec2 vertex;

void main(){
    vec4 color = texture(diffuse, vertex)*0.5;
    vec3 p = vec3(texture(position, vertex));
    vec3 n = normalize(vec3(texture(normal, vertex)));

    float ndotl = max(dot(n, normalize(light0.direction)), 0.0); // simple phong

    if(ndotl > 0.0){
        color += ndotl*light0.diffuse;
    }

    gl_FragColor = color;
}
DirLight light0 = DirLight(vec3(-1, 0, 0), vec4(0.3), vec4(0.1));