【问题标题】:Display Part of Texture in GLSL在 GLSL 中显示部分纹理
【发布时间】:2014-01-23 12:12:54
【问题描述】:

我正在使用 GLSL 从精灵表中绘制精灵。我使用的是 jME 3,但只有很小的差异,而且仅与不推荐使用的功能有关。

从精灵表中绘制精灵最重要的部分是只绘制像素的子集/范围,例如从 (100, 0) 到 (200, 100) 的范围。在下面的测试用例 sprite-sheet 中,使用之前的边界,只会绘制 sprite-sheet 的绿色部分。

.

这是我目前所拥有的:

定义:

MaterialDef Solid Color {
    //This is the list of user-defined variables to be used in the shader
    MaterialParameters {
        Vector4 Color
        Texture2D ColorMap
    }
    Technique {
        VertexShader GLSL100:   Shaders/tc_s1.vert
        FragmentShader GLSL100: Shaders/tc_s1.frag

        WorldParameters {
            WorldViewProjectionMatrix
        }
    }
}

.vert 文件:

uniform mat4 g_WorldViewProjectionMatrix;
attribute vec3 inPosition;

attribute vec4 inTexCoord;
varying vec4 texture_coordinate;

void main(){
    gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
    texture_coordinate = vec4(inTexCoord);
}

.frag:

uniform vec4 m_Color;
uniform sampler2D m_ColorMap;
varying vec4 texture_coordinate;

void main(){
    vec4 color = vec4(m_Color);
    vec4 tex = texture2D(m_ColorMap, texture_coordinate);
    color *= tex;
    gl_FragColor = color;
}

在 jME 3 中,inTexCoord 指的是 gl_MultiTexCoord0,而 inPosition 指的是 gl_Vertex。

如您所见,我尝试将 texture_coordinate 赋予 vec4 类型,而不是 vec2,以便能够引用其 p 和 q 值(texture_coordinate.p 和 texture_coordinate.q)。修改它们只会导致不同的色调。

m_Color 是指用户输入的颜色,用于改变色调。在这种情况下,应该忽略它。

到目前为止,着色器按预期工作并且纹理显示正确。

我一直在使用来自 NeHe (http://nehe.gamedev.net/article/glsl_an_introduction/25007/) 和 Lighthouse3D (http://www.lighthouse3d.com/tutorials/glsl-tutorial/simple-texture/) 的资源和教程。

我应该更改哪些函数/值以获得仅显示部分纹理的预期效果?

【问题讨论】:

    标签: opengl glsl shader texture-mapping jmonkeyengine


    【解决方案1】:

    通常,如果您只想显示纹理的一部分,那么您可以更改与每个顶点关联的纹理坐标。由于您没有显示您如何告诉 OpenGL 您的顶点的代码,因此我不确定该建议什么。但一般来说,如果您使用的是旧的已弃用函数,请不要这样做:

    // Lower Left of triangle
    glTexCoord2f(0,0);
    glVertex3f(x0,y0,z0);
    
    // Lower Right of triangle
    glTexCoord2f(1,0);
    glVertex3f(x1,y1,z1);
    
    // Upper Right of triangle
    glTexCoord2f(1,1);
    glVertex3f(x2,y2,z2);
    

    你可以这样做:

    // Lower Left of triangle
    glTexCoord2f(1.0 / 3.0, 0.0);
    glVertex3f(x0,y0,z0);
    
    // Lower Right of triangle
    glTexCoord2f(2.0 / 3.0, 0.0);
    glVertex3f(x1,y1,z1);
    
    // Upper Right of triangle
    glTexCoord2f(2.0 / 3.0, 1.0);
    glVertex3f(x2,y2,z2);
    

    如果您使用的是 VBO,则需要修改纹理坐标数组,以便以类似的方式访问纹理的相应部分。

    对于sampler2D,纹理坐标被归一化,因此最左边和最底部的坐标为 0,最右边和最顶部的坐标为 1。因此,对于 300 像素宽纹理的示例,绿色部分将介于纹理宽度的 1/3 到 2/3 之间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多