2 opengl中的通过效果

Posted

技术标签:

【中文标题】2 opengl中的通过效果【英文标题】:2 pass effect in opengl 【发布时间】:2012-12-28 22:20:12 【问题描述】:

我尝试在 OpenGL 中使用 FBO 创建一个 2 通道效果。

在第一遍中,我将深度写入颜色缓冲区(图 1):

在其顶点着色器中使用以下内容:

gl_Position = projection * view * gl_Vertex;
vec4 position = gl_Position/gl_Position.w;
position = position / 2.0 + 0.5;
float temp_depth = position.z;
gl_FrontColor = vec4(temp_depth,temp_depth,temp_depth,1);

在第二遍中,我尝试使用上一遍中的纹理并为场景着色(图 2):

这是顶点着色器中的代码:

vec4 shadow_coord  = projection * view * gl_Vertex;
shadow_coord = shadow_coord / shadow_coord.w;
shadow_coord = shadow_coord / 2.0 + 0.5;
gl_FrontColor  = texture2D(light_depth_texture, shadow_coord.xy);

场景由圆锥体前面的四边形组成。在这两种情况下,片段着色器都是gl_FragColor = gl_Color; 在这两种情况下的视图和投影矩阵在开始时定义的完全相同。问题是shadow_coord.xy有偏差。

只要视图值和投影值完全相同,我不应该得到相同的结果吗?

我能做些什么来解决它?

【问题讨论】:

你的#version指令在哪里? 深度缓冲是否使用了浮点纹理? 你好。我不写入深度缓冲区。我写到颜色缓冲区。内部格式:GL_RGBA 源格式:GL_RGBA 类型:GL_UNSIGNED_BYTE Thnx @getpfault 我使用#version 120 不完全确定您要在这里实现什么,但仅使用 8 位精度存储深度值似乎很奇怪。 【参考方案1】:

您渲染的纹理使用什么分辨率?以及什么样的过滤? (似乎是线性的,应该是最近的)。还可以尝试偏移您读取的坐标,例如:

// offset should be 0.5 / texture_resolution
gl_FrontColor  = texture2D(light_depth_texture, shadow_coord.xy + offset);

正如其他评论者所说,8 位不足以存储深度值,请考虑使用深度纹理或浮点格式(如ARB_texture_rg 中的 GL_R32F)。

【讨论】:

以上是关于2 opengl中的通过效果的主要内容,如果未能解决你的问题,请参考以下文章

如何通过openGL创建鱼眼镜头效果? [复制]

使用 OpenGL-ES 绘制应用程序中的模糊效果(湿中湿效果)

OPENGL中的技术方法都有哪些

StarWars.Android 界面粉碎效果中的openGL操作解析

StarWars.Android 界面粉碎效果中的openGL操作解析

[OpenGL] 骨骼动画混合效果