首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GLSL中显示纹理部分

在GLSL中显示纹理部分
EN

Stack Overflow用户
提问于 2014-01-23 12:12:54
回答 1查看 2.8K关注 0票数 1

我用GLSL从雪碧片上画出精灵。我使用的是jME 3,但是只有很小的差别,而且只与不推荐的函数有关。

从sprite工作表中绘制sprite最重要的部分是只绘制一个子集/像素范围,例如,范围从(100,0)到(200,100)。在下面的测试用例中,使用前面的边界,只绘制雪碧工作表的绿色部分。

到目前为止,这就是我所拥有的:

定义:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 (introduction/25007/)和Lighthouse3D (http://www.lighthouse3d.com/tutorials/glsl-tutorial/simple-texture/)的资源和教程。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-25 07:09:01

通常,如果只想显示纹理的一部分,则更改与每个顶点关联的纹理坐标。由于您没有显示您的代码如何告诉OpenGL关于您的顶点,我不知道有什么建议。但是通常,如果您使用的是旧的弃用函数,而不是这样做的:

代码语言:javascript
复制
// 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);

你可以这样做:

代码语言:javascript
复制
// 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/3rds之间是纹理的宽度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21307823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档