6

在决定尝试在现代 OpenGL 中进行编程后,我已经放弃了固定功能管道,并且我不完全确定能否获得与以前相同的功能。

我正在尝试用像素完美大小来纹理贴图四边形,匹配纹理大小。例如,一个 128x128 的纹理映射到一个大小为 128x128 的四边形。

这是我的顶点着色器。


    #version 110
    uniform float xpos;
    uniform float ypos;
    uniform float tw; // texture width in pixels
    uniform float th; // texture height in pixels
    attribute vec4 position;
    varying vec2 texcoord;        
void main()
    {
    mat4 projectionMatrix = mat4( 2.0/600.0, 0.0, 0.0, -1.0,
                                  0.0, 2.0/800.0, 0.0, -1.0,
                                  0.0, 0.0, -1.0, 0.0,
                                  0.0, 0.0, 0.0, 1.0); 

    gl_Position = position * projectionMatrix;
    texcoord = (gl_Position.xy);
    }

这是我的片段着色器:


    #version 110
    uniform float fade_factor;    
    uniform sampler2D textures[1];
    varying vec2 texcoord;

    void main()
    {
        gl_FragColor = texture2D(textures[0], texcoord);
    }

我的顶点数据就是这样,其中 w 和 h 是纹理的宽度和高度。


    [
     0, 0,
     w, 0,
     w, h,
     0, h
    ]

我加载了 128x128 纹理,使用这些着色器,我看到图像重复了 4 次:http: //i.stack.imgur.com/UY7Ts.jpg

鉴于 tw th、xpos、xpos 制服,任何人都可以就正确的翻译和缩放方式提供建议吗?

4

1 回答 1

7

这有一个问题:

mat4 projectionMatrix = mat4( 2.0/600.0, 0.0, 0.0, -1.0,
                                  0.0, 2.0/800.0, 0.0, -1.0,
                                  0.0, 0.0, -1.0, 0.0,
                                  0.0, 0.0, 0.0, 1.0); 

gl_Position = position * projectionMatrix;

变换 matices 是右结合的,即你应该乘以相反的顺序。此外,您通常不会在着色器中指定投影矩阵,而是将其作为制服传递。OpenGL 为您提供了现成的用于投影和模型视图的制服。在 OpenGL-3 核心中,您可以重用统一名称以保持兼容。

// predefined by OpenGL version < 3 core:
#if __VERSION__ < 400
uniform mat4 gl_ProjectionMatrix;
uniform mat4 gl_ModelviewMatrx;
uniform mat4 gl_ModelviewProjectionMatrix; // premultiplied gl_ProjectionMatrix * gl_ModelviewMatrix
uniform mat4 gl_ModelviewInverseTranspose; // needed for transformin normals

attribute vec4 gl_Vertex;

varying vec4 gl_TexCoord[];
#endif 

void main()
{
     gl_Position = gl_ModelviewProjectionMatrix * gl_Vertex;
}

接下来您必须了解纹理坐标不涉及纹理像素(纹素),而是应该将纹理理解为具有给定采样点的插值函数;纹理坐标 0 或 1 不会碰到纹素的中心,而是正好位于环绕之间,因此会变得模糊。只要屏幕上的四边形尺寸与纹理尺寸完全匹配,就可以了。但是,只要您只想显示子图像,事情就会变得有趣(我将其作为练习留给读者找出确切的映射;提示:您将拥有术语 0.5/dimension 和 (dimension - 1)/dimension在解决方案中)

于 2011-04-23T13:53:18.053 回答