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-ES 绘制应用程序中的模糊效果(湿中湿效果)
StarWars.Android 界面粉碎效果中的openGL操作解析