【发布时间】: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