GLSL着色器中的模型到屏幕坐标混淆

时间:2012-11-23 10:19:41

标签: opengl glsl unity3d

在我的着色器中,我已经有一个特殊变量,它具有以前渲染屏幕的整个内容。它存储在

uniform sampler2D _GrabTexture;

它的内容应该是: Screen content

(作为旁注,我正在使用Unity的GrabPass {}来获取整个屏幕。另外请忽略Unity的GUI)

现在如何使用_GrabTexture作为我的平面模型的纹理来渲染再传递,所以结果与我的_GrabTexture完全相同?

(关键是,我可以在再渲染一次之前对屏幕纹理应用一些效果,如模糊,锐化等,这样平面的纹理现在已经风格化了。)

我在最后一次传球中尝试这个。该变量在Vertex和amp;中声明。 Fragment Shader。

uniform sampler2D _GrabTexture;
varying vec4 v_Position;

顶点着色器:

void main()
        {
            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
            v_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

        }

将每个模型顶点的屏幕坐标存储为变化,以便在片段着色器中使用。

片段着色器:

void main()
        {
            gl_FragColor = texture2D(_GrabTexture,vec2(v_Position)); 
        }

现在使用存储的变化位置来访问_GrabTexture屏幕纹理。因为它是整个屏幕,我的v_Position已经在屏幕坐标中应该正确地得到正确的像素。

但结果是

enter image description here

正如您所看到的,飞机的纹理是“各种”显示先前渲染的屏幕,但坐标不正确。如何修复它以使结果与第一张图像相同?

1 个答案:

答案 0 :(得分:4)

你认为太复杂了。 OpenGL告诉您在变量gl_FragCoord中构建的片段着色器中的屏幕片段位置。

使用GLSL-1.30或更新版本,您可以texelFetch直接将gl_FragCoord作为源坐标。或者您将translate gl_FragCoord用于纹理空间坐标,请参阅https://stackoverflow.com/a/5879551/524368