OpenGL - 使用非规范化的texcoords

时间:2015-08-06 08:13:59

标签: c# opengl opentk

默认情况下,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中?

2 个答案:

答案 0 :(得分:1)

要为此案例设置纹理转换,请使用:

img {
  display: none !important;
  /* visibility: hidden !important; */
}

* {
  background-image: none !important;
}

看起来你试图用glMatrixMode(GL_TEXTURE); glScalef(1.0f / textureWidth, 1.0f / textureHeight, 1.0f); 做同样的事情。虽然这是可能的,但以下会给出所需的结果:

glOrtho()

glOrtho(0.0, textureWidth, 0.0, textureHeight, ...); 构建一个矩阵,可以在两个坐标方向上将给定范围转换为[-1.0,1.0]范围。这很有意义,因为它主要用于需要转换为NDC空间的顶点坐标,即[-1.0,1.0]。

但是,对于纹理坐标,您希望将[0.0,textureWidth]和[0.0,textureHeight]范围转换为范围[0.0,1.0]。如果您完全开始使用glOrtho(),则正确的调用将是:

glOrtho()

由于现在将[-textureWidth,textureWidth]映射到[-1.0,1.0],这意味着它将[0.0,textureWidth]映射到[0.0,1.0],这是所需的转换。

但是,使用我的答案开头显示的glOrtho(-textureWidth, textureWidth, -textureHeight, textureHeight, 1.0, -1.0); 电话会更容易,更清晰。

答案 1 :(得分:0)

我仍然无法弄清楚为什么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);