2014-01-23 5 views
1

스프라이트 시트에서 스프라이트를 그리는 데 GLSL을 사용하고 있습니다. jME 3을 사용하고 있지만, 약간의 차이점이 있으며, 더 이상 사용되지 않는 기능에 대해서만 있습니다.GLSL의 텍스처 부분 표시

스프라이트 시트에서 스프라이트를 그릴 때 가장 중요한 부분은 픽셀의 하위 집합/범위 (예 : (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 :

JME 3에서
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; 
} 

, inTexCoord는 gl_MultiTexCoord0을 참조합니다. , inPosition은 gl_Vertex를 참조합니다.

보시다시피 texture_coordinate에 vec2가 아닌 vec4 유형을 지정하여 해당 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); 

당신이 할 수있는 : 당신이 VBOs를 사용하는 경우

// 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/3 사이.