2014-01-23 110 views
1

我正在使用GLSL從精靈表中繪製精靈。我正在使用jME 3,但只有很小的差異,並且僅針對已棄用的函數。顯示GLSL中紋理的一部分

從sprite工作表繪製sprite最重要的部分是繪製像素的一個子集/範圍,例如從(100,0)到(200,100)的範圍。在下面的測試案例精靈表中,並且使用前面的界限,將只繪製精靈表的綠色部分。

Test case 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/)的資源和教程。

我應該改變哪些函數/值來獲得僅顯示部分紋理的所需效果?

回答

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); 

,那麼你需要修改以相似的方式訪問紋理的相應部分的紋理座標數組。

對於sampler2D紋理座標是標準化的,所以最左邊和最底部的座標是0,最右邊和最頂端是1.因此,對於300像素寬的紋理的示例,綠色部分將是1/3和2/3rds之間的紋理寬度。