2012-02-16 4 views
2
필자는 오픈 GL ES 2.0 프로그래밍 가이드를 사용하고과 (2x2- 빨간색 녹색 파란색 노란색 질감에 대한 9 장을 다음하지만 같은 픽셀 배열을 설정 살아야하고

) 그리고 전체 삼각형에 대해서만 빨간색을 보여줍니다. Cant가 문제를 찾은 것 같아요, 제 쉐이더도 괜찮습니다. 제 코드가 도움이 되십시오.오픈 GL ES의 텍스처 코드에서 버그를 발견하는 데 도움이 필요 2.0 사용하여 쉐이더

- (void)setupGL 
    { 
    [EAGLContext setCurrentContext:self.context]; 

    [self loadShaders]; 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_SRC_COLOR); 

    glGenVertexArraysOES(1, &_vertexArray); 
    glBindVertexArrayOES(_vertexArray); 

    glGenBuffers(1, &_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(gRectVertexData), gRectVertexData, GL_STATIC_DRAW); 

// 2 x 2 Image, 3 bytes per pixel(R, G, B) 
GLubyte pixels[12] = 
{ 
    255,0,0, // Red 
    0,255,0, // Green 
    0,0,255, // Blue 
    0,255,255 // Yellow 
}; 
    // Use tightly packed data 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    // Generate a texture object 
glGenTextures(1, &texture[0]); 
    // Bind the texture object 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
    // Load the texture 
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, 2,2, 0, GL_RGB, 
       GL_UNSIGNED_BYTE, pixels); 
// Set the filtering mode 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    GLint SamplerLoc = glGetUniformLocation(_program, "Texture"); 
glUniform1i(SamplerLoc, 0); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(12)); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(24)); 

glBindVertexArrayOES(0); 

}

내 부하 쉐이더 부분이 있습니다

glBindAttribLocation(_program, ATTRIB_VERTEX, "position"); 
glBindAttribLocation(_program, ATTRIB_NORMAL, "normal"); 
glBindAttribLocation(_program, ATTRIB_TEX, "TexCoordIn"); 

는 내 버텍스 쉐이더와 프레 그먼트 쉐이더는

attribute vec4 position; 
attribute vec3 normal; 
attribute vec2 TexCoordIn; 

varying lowp vec4 colorVarying; 
varying vec2 TexCoordOut; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat3 normalMatrix; 

void main() 
{ 
    vec3 eyeNormal = normalize(normalMatrix * normal); 
    vec3 lightPosition = vec3(0.0, 0.0, 1.0); 
    vec4 diffuseColor = vec4(0.8, 0.4, 1.0, 1.0); 

    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); 

    colorVarying = diffuseColor*nDotVP; 

    gl_Position = modelViewProjectionMatrix * position; 
    TexCoordOut = TexCoordIn; 
} 

조각 쉐이더

다음대로
varying lowp vec4 colorVarying; 
varying lowp vec2 TexCoordOut; 
uniform sampler2D Texture; 

void main() 
{ 
lowp vec4 col = texture2D(Texture, TexCoordOut); 
col.x *= colorVarying.x; 
col.y *= colorVarying.x; 
col.z *= colorVarying.x; 
col.a = 1.0; 
    gl_FragColor = col; 
} 

답변

1

glBindAttribLocation(_program, ATTRIB_TEX, "TexCoordIn"); 

가 대신 ATTRIB_TEX 열거의 GLKVertexAttribTexCoord0를 사용하도록 통화 변경

.

이는 OpenGL 게임 프로젝트의 성가신 잡았다입니다. 그들은 위치와 법선에 대한 자신의 glBindAttribLocation 전화에서 사용하는 열거 회원은 GLKVertexAttribPosition 및 GLKVertexAttribNormal 열거와 같은 값을 가질 일이 있지만, 이것은 단지 우연의 일치입니다.

체크 아웃 단계별 지침에 대한 headnoodles에 게시 할 수 있습니다. 이 예제는 GLKit을 사용하지만 다른 모든 것은 동일해야합니다.

0

텍스처 좌표 만 출력하면 어떻게됩니까?

는 [0-1]의 기울기를 볼 수 있습니까?

+0

난 gl_FragColor = vec4 (TexCoordOut.x, TexCoordOut.y, 1,1)를 사용; 그리고 파란색으로 변 했으므로 텍스쳐 좌표가 잘못된 것을 볼 수 있습니다. 그래서 내가 잘못 된 곳을 볼 수 있습니다. 내가 꼭지점을 선언 할 때 속성을 올바르게 넣었습니까? – bobjamin

+0

모델/메시에 올바른 uv 좌표가 있습니까? 그렇다면 입력 텍스처 좌표가 잘못되었습니다. OpenGl을 잘 모르기 때문에 나는 당신을 도울 수 없다. 나는 많은 셰이더를 프로그래밍했지만 OpenGl/DirectX 레벨에서 일하지 않았다. 그러나 최소한 오류를 좁힐 수 있습니다. Shader와 Mesh가 적어도 정확하다는 것을 확신하도록 Rendermonkey로 Shader를 개발하거나 포트하는 것이 항상 좋은 출발입니다. – djmj