OpenGL ES3帧缓冲以红色标度绘制深度

时间:2017-09-10 14:28:04

标签: glsl framebuffer opengl-es-3.0 shadow-mapping

因此,经过努力使定向光影贴图最终工作后,我可以看到在四边形上渲染的阴影贴图,但它仅以深度self和类型GL_DEPTH_COMPONENT16或{{1}绘制}并输入GL_UNSIGNED_SHORT但它是红色比例而不是灰度

Depth map

问题是我使用了很多方法来计算绘制阴影的深度,但没有出现阴影。

GL_DEPTH_COMPONENT32F

,片段是:

GL_FLOAT

1 个答案:

答案 0 :(得分:3)

  

...但它是红色比例而不是灰度

具有深度成分格式的纹理(例如GL_DEPTH_COMPONENT16GL_DEPTH_COMPONENT32F只有1个颜色通道,红色颜色通道。
如果从纹理采样器中读取深度分量纹理的数据,则会自动设置绿色,蓝色和alpha通道。

Khronos集团的Image Format规范说:

  

图像格式不必存储每个组件。当着色器对这样的纹理进行采样时,它仍将解析为4值RGBA向量。未以图像格式存储的组件将自动填写。如果缺少R,G或B,则使用零,而丢失的Alpha总是解析为1.

注意:纹理调整可以改变缺失值。< / p>

因此,设置了红色,绿色和蓝色设置为0,alpha通道为1.导致不透明的红色表面。

如果要从深度组件纹理中读取灰度颜色,则必须读取红色颜色通道,并且必须将红色通道应用于绿色和蓝色。

你必须调整这样的代码:

float depth          = texture( shadowMap, ..... ).r;
vec3  depthGrayscale = vec3( depth );

或者这个:

vec3  depthGrayscale = texture( shadowMap, ..... ).rrr;