Opengl 在GLSL中显示部分纹理

Opengl 在GLSL中显示部分纹理,opengl,glsl,shader,texture-mapping,jmonkeyengine,Opengl,Glsl,Shader,Texture Mapping,Jmonkeyengine,我正在使用GLSL从精灵表中绘制精灵。我使用的是JME3,但它们之间只有很小的区别,而且仅与不推荐使用的函数有关 从精灵图纸绘制精灵最重要的部分是仅绘制像素的子集/范围,例如从(100,0)到(200,100)的范围。在下面的测试用例sprite表中,使用前面的边界,只绘制sprite表的绿色部分 这就是我到目前为止所做的: 定义: MaterialDef Solid Color { //This is the list of user-defined variables to be

我正在使用GLSL从精灵表中绘制精灵。我使用的是JME3,但它们之间只有很小的区别,而且仅与不推荐使用的函数有关

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

这就是我到目前为止所做的:

定义:

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;
}
在JME3中,inTexCoord指的是gl_MultiTexCoord0,inPosition指的是gl_顶点

如您所见,我尝试将纹理坐标设置为vec4类型,而不是vec2,以便能够引用其p和q值(纹理坐标.p和纹理坐标.q)。修改它们只会产生不同的色调

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

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

我一直在使用NeHe()和Lighthouse 3D()的资源和教程


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

通常,如果只想显示部分纹理,则可以更改与每个顶点关联的纹理坐标。由于您没有显示如何告诉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);
如果使用VBOs,则需要修改纹理坐标数组,以类似方式访问纹理的相应部分

对于
sampler2D
纹理坐标进行规格化,以便最左侧和最底部的坐标为0,最右侧和最顶部的坐标为1。因此,对于300像素宽的纹理示例,绿色部分将介于纹理宽度的1/3到2/3之间