在glsl着色器中导出屏幕空间坐标

时间:2014-06-16 20:13:28

标签: opengl glsl texture-mapping render-to-texture

我正在尝试编写一个简单的应用程序,用于从绘制缓冲区烘焙纹理。现在我有一个网格,一个网格纹理和一个油漆纹理。当我渲染网格时,网格着色器将查找网格纹理,然后根据片段的屏幕位置查找绘制纹理值。然后,我将绘制查找与网格查找合成。

这是一个截图,在paint缓冲区中没有任何内容,只有网格纹理。

Just the mesh texture

这是一个截图,其中包含在网格纹理上合成的绘图缓冲区中的内容。

Screen-space paint texture composited over mesh texture

所以一切都很好,但我想将油漆纹理烘焙到我的网格纹理中。现在我将网格的UV向下发送为正交设置为(0,1)x(0,1)的位置,所以我实际上在纹理空间中做了所有事情。网格纹理查找也是位置。我遇到的问题是从原始投影计算片段的屏幕空间位置,以找出在哪里采样绘制纹理。我正在通过烘焙着色器我的原始相机项目矩阵和对象位置向片段着色器发送片段的设备规范化位置(再次从我原来的相机投影)进行查找,但它很有趣。

如果我使用我导出的油漆纹理和屏幕位置渲染一半输出,这就是烘焙纹理生成的内容。

Half mesh texture, half screen-space texture using bake shader

我希望块线在中间。

我在顶点着色器中是否错误地计算了屏幕位置?或者我是否以一种根本错误的方式解决这个问题?

    // vertex shader
uniform mat4 orthoPV;
uniform mat4 cameraPV;
uniform mat4 objToWorld;
varying vec2 uv;
varying vec2 screenPos;
void main() {
  uv = gl_Vertex.xy;
  screenPos = 0.5 * (vec2(1,1) + (cameraPV * objToWorld * vec4(gl_MultiTexCoord0.xyz,1)).xy);
  screenPos = gl_MultiTexCoord0.xy;
  gl_Position = orthoPV * gl_Vertex;
  gl_FrontColor = vec4(1,0,0,1);
}

// fragment shader
uniform sampler2D meshTexture;
uniform sampler2D paintTexture;
varying vec2 uv;
varying vec2 screenPos;
void main() {
    gl_FragColor = texture2D(meshTexture, uv);
    if (screenPos.x > .5)
        gl_FragColor = texture2D(paintTexture, uv);
}

0 个答案:

没有答案