我用GLSL从雪碧片上画出精灵。我使用的是jME 3,但是只有很小的差别,而且只与不推荐的函数有关。
从sprite工作表中绘制sprite最重要的部分是只绘制一个子集/像素范围,例如,范围从(100,0)到(200,100)。在下面的测试用例中,使用前面的边界,只绘制雪碧工作表的绿色部分。

。
到目前为止,这就是我所拥有的:
定义:
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 (introduction/25007/)和Lighthouse3D (http://www.lighthouse3d.com/tutorials/glsl-tutorial/simple-texture/)的资源和教程。
我应该修改哪些函数/值以获得只显示部分纹理的预期效果?
发布于 2014-01-25 07:09:01
通常,如果只想显示纹理的一部分,则更改与每个顶点关联的纹理坐标。由于您没有显示您的代码如何告诉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/3rds之间是纹理的宽度。
https://stackoverflow.com/questions/21307823
复制相似问题