我正在忙着实现一个延迟光照系统,并且已经在片段着色器中获得了绑定位置,漫反射和普通纹理,我将在其中计算每个片段的光照规格。
#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
对于请求的屏幕截图,基本上没有引用变量我得到这样的东西:
有了它,我得到一个黑屏,很容易想象。 (虽然在旋转视图矩阵(y轴)时,有一个点,四边形变为绿色,虽然我无法得到它的值)