【问题标题】:Model-to-screen coordinate confusion in GLSL shaderGLSL 着色器中的模型到屏幕坐标混淆
【发布时间】:2012-11-24 11:44:10
【问题描述】:

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

uniform sampler2D _GrabTexture;

它的内容应该是:

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

现在我怎样才能再渲染一遍,使用 _GrabTexture 作为我的平面模型的纹理,所以结果与我的 _GrabTexture 完全相同?

(重点是,我可以在再渲染一遍之前对屏幕纹理应用一些效果,如模糊、锐化等,这样飞机的纹理现在就被风格化了。)

我正在最后一关尝试这个。该变量在 Vertex 和 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 应该正确获得正确的像素。

但结果是

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

【问题讨论】:

    标签: opengl glsl unity3d


    【解决方案1】:

    你想得太复杂了。 OpenGL 会告诉您在片段着色器中内置变量 gl_FragCoord 中的屏幕片段位置。

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

    【讨论】:

    • 谢谢!您的转换可以解决问题,因为我在 Unity 的 GLSL 中不支持 texelFetch。 (我也知道gl_FragCoord,但我想知道它是如何让我忘记的)但缺点是我无法在着色器代码中知道sampler2D 在运行时的宽度和高度,所以我必须根据我的屏幕进行设置。
    • @Sargon:使用统一的纹理大小作为附加的 vec2 传递。
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多