GLSL使用in变量时,片段着色器会导致意外输出

时间:2016-09-03 21:02:10

标签: opengl glsl fragment-shader

我正在忙着实现一个延迟光照系统,并且已经在片段着色器中获得了绑定位置,漫反射和普通纹理,我将在其中计算每个片段的光照规格。

#version 400 core

in vec3 fs_position;
in vec3 fs_color;
in vec4 fs_attenuation;

layout (location = 0) out vec4 outColor;

uniform sampler2D diffuseSampler;
uniform sampler2D positionSampler;
uniform sampler2D normalSampler;

const float cutOffFactor = 200;
const float reflectivity = 0.15;
const float shineDamper = 1;


void main(void){
    vec2 frag = gl_PointCoord.xy;
    frag.x = (frag.x+1)/2f;
    frag.y = ((frag.y+1)/2f);


    vec4 texDiffuse = texture(diffuseSampler,frag);
    vec4 texPosition = texture(positionSampler,frag);
    vec4 texNormal = texture(normalSampler,frag);

    vec3 p = vec3(fs_position.xyz);
    vec3 ePosition = texPosition.xyz;
    ePosition = ePosition*200;
    vec3 eNormal = texNormal.xyz;
    vec3 unitNormal = normalize(eNormal);



    outColor = vec4(texNormal.xyz,1.0);
}

这就是我的片段着色器所包含的所有内容。 探针位于“vec3 p = vec3(fs_position.xyz);”。 当我删除它时,程序呈现一个完美的法线贴图,但当我添加一个空白屏幕,我可以旋转,最终某种颜色闪烁。

fs_position与颜色无关,并且是从几何着色器输入的(所有引用都是正确的)但它以某种方式导致了大量的故障。 同样的事情也发生在变量中(fs_color和fs_attenuation)。

正在渲染的是一个具有相同的每顶点属性的非混合四边形,它覆盖了渲染到存在的color_attachment的视口(如上所述,没有那条线,一切正常)。 (混合什么都不做,当我得到一个值得让我继续的结果时,我会加上添加剂混合)

任何帮助都将受到赞赏,引擎和着色器之前从未对我采取过这种方式,并且没有出现错误。

额外代码:

顶点着色器

    #version 400 core

    in vec3 position;
    in vec3 color;
    in vec4 attenuation;

    out vec3 gs_position;
    out vec3 gs_color;
    out vec4 gs_attenuation;

    uniform mat4 projectionMatrix;
    uniform mat4 viewMatrix;

    void main(void){
        vec4 worldPosition = vec4(position,1.0);
        vec4 viewPosition = viewMatrix * worldPosition;
        gl_Position = projectionMatrix * viewPosition;

        gs_position = viewPosition.xyz;
        gs_color = color;
        gs_attenuation = attenuation;
   }

几何着色器

#version 150

layout (points) in;
layout (triangle_strip,max_vertices = 4) out;

in vec3 gs_position[];
in vec3 gs_color[];
in vec4 gs_attenuation[];


out vec3 fs_position;
out vec3 fs_color;
out vec4 fs_attenuation;

void main(void){

    gl_Position = vec4(-1,1,0,1);
    fs_position = gs_position[0];
    fs_color = gs_color[0];
    fs_attenuation = gs_attenuation[0];
    EmitVertex();

    gl_Position = vec4(-1,-1,0,1);
    fs_position = gs_position[0];
    fs_color = gs_color[0];
    fs_attenuation = gs_attenuation[0];
    EmitVertex();

    gl_Position = vec4(1,1,0,1);
    fs_position = gs_position[0];
    fs_color = gs_color[0];
    fs_attenuation = gs_attenuation[0];
    EmitVertex();

    gl_Position = vec4(1,-1,0,1);
    fs_position = gs_position[0];
    fs_color = gs_color[0];
    fs_attenuation = gs_attenuation[0];
    EmitVertex();

    EndPrimitive();
}

光照值示例:

  • 位置:-1,0.5,-1

  • 颜色:0,0.5,0

  • 衰减:1,0.1,0.2,0

对于请求的屏幕截图,基本上没有引用变量我得到这样的东西:

Object Normal texture

有了它,我得到一个黑屏,很容易想象。 (虽然在旋转视图矩阵(y轴)时,有一个点,四边形变为绿色,虽然我无法得到它的值)

0 个答案:

没有答案