我正在尝试进行一种光烘焙。这个想法是在预通道中将光“烘焙”到纹理中”,以便在主通道中使用的纹理已经被着色。我这样做:
- 使用输入纹理的大小创建 FBO 和纹理附件。
- 绑定输入纹理并渲染到全屏四边形。
- 为我的 3d 网格使用输出纹理(将光线烘焙到其中)。
目前它不起作用。结果是黑色的。我想这与片段坐标与使用模型视图投影矩阵转换顶点时的预期不同(在我的情况下我输出归一化顶点坐标)。
这是我的顶点着色器:
#version 420 core
layout(location = 0) in vec4 position;//vertices are in range [-1,1]
layout(location = 1) in vec2 uvs;
layout(location = 2) in vec3 normal;
uniform mat4 MODEL_VIEW_MATRIX;
noperspective out vec2 vTexcoord;
out vec3 Position;
out smooth vec3 Normal;
out gl_PerVertex
{
vec4 gl_Position;
};
void main() {
vTexcoord = position.xy * 0.5 + 0.5;
Normal = vec3(normalize(MODEL_VIEW_MATRIX * vec4(normal,0)));
Position = vec3(MODEL_VIEW_MATRIX * position);
gl_Position = vec4( position.xy ,0.0 , 1.0 );
}
片段着色器:
void main() {
ivec2 tsize = textureSize(COLOR_MAP_0, 0);
vec2 texcoord = gl_FragCoord.xy * (1.0 / vec2(tsize));
fResult = texture(COLOR_MAP_0 , texcoord) ;
fResult.rgb *= pointlightType(0 , Position , Normal);// typical point light algo
}
我在这里想念什么?在我的情况下深度缓冲区也不可用。
更新:
我解决了。问题是一些制服没有传递给着色器。由于在我的例子中源纹理和目标纹理具有相同的尺寸,因此实现是微不足道的。