OpenGL的 - 使用非标准化texcoords(OpenGL - Use non normali

2019-11-03 22:54发布

缺省情况下,使用的OpenGL归TexCoords,这意味着值必须是0和1([0..1])之间。 共同执行Vertex必须是这个样子:

        // Common Implementation of Vertex
        Vertex v = new Vertex(
            // Position
            new Vector2(0f, 500f), 
            // 'Normalized' TexCoords [0..1]
            new Vector2(0f, 1f), 
            // Color of Vertex
            Color.White
        );

        // Or in immediate mode..
        // It's the same, we still need to specify between 0 and 1 ([0..1])
        GL.TexCoord2(1f, 0f);

然而,是否有可能使用非归一化texcoord(所以它在像素格式指定,这意味着值必须是0和大小([0..size])之间)在OpenGL?

Answer 1:

要设置纹理转化为这种情况下,使用方法:

glMatrixMode(GL_TEXTURE);
glScalef(1.0f / textureWidth, 1.0f / textureHeight, 1.0f);

它看起来像你试图做同样的事情glOrtho() 虽然这是可能的,下面将不会得到预期的结果:

glOrtho(0.0, textureWidth, 0.0, textureHeight, ...);

glOrtho()建立,其将所述给定的范围在范围[-1.0,1.0]在两个坐标方向上的矩阵。 这是有意义的,因为它主要是用于顶点坐标需要被转化为NDC空间,这是[-1.0,1.0]。

然而,对于纹理坐标,要变换的[0.0,textureWidth]和[0.0,textureHeight]范围在范围[0.0,1.0]。 如果完全使用设置glOrtho()正确的调用是:

glOrtho(-textureWidth, textureWidth, -textureHeight, textureHeight, 1.0, -1.0);

由于该映射现在[-textureWidth,textureWidth]至[-1.0,1.0],这意味着它映射[0.0,textureWidth]至[0.0,1.0],这是所期望的转化。

但它更容易和更清洁的使用glScalef()在我的答案开始显示通话。



Answer 2:

我仍然无法弄清楚,为什么GL.Ortho (而在MatrixMode.Texture )没有给我想要的结果..

所以最后,我结束了手动计算矩阵:

        // Initialize identity matrix
        Matrix4 matrix = new Matrix4
                         (1f, 0f, 0f, 0f,
                          0f, 1f, 0f, 0f,
                          0f, 0f, 1f, 0f,
                          0f, 0f, 0f, 1f);

        // Or use Matrix4.Identity (in OpenTK case), that should be equal(?)

        // Convert to normalized
        matrix[0, 0] = 1f / textureWidth;
        matrix[1, 1] = 1f / textureHeight;

        // Apply the matrix to texture matrix
        GL.MatrixMode(MatrixMode.Texture);
        GL.LoadMatrix(ref matrix);


文章来源: OpenGL - Use non normalized texcoords
标签: c# opengl opentk