) 그리고 전체 삼각형에 대해서만 빨간색을 보여줍니다. 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;
}
난 gl_FragColor = vec4 (TexCoordOut.x, TexCoordOut.y, 1,1)를 사용; 그리고 파란색으로 변 했으므로 텍스쳐 좌표가 잘못된 것을 볼 수 있습니다. 그래서 내가 잘못 된 곳을 볼 수 있습니다. 내가 꼭지점을 선언 할 때 속성을 올바르게 넣었습니까? – bobjamin
모델/메시에 올바른 uv 좌표가 있습니까? 그렇다면 입력 텍스처 좌표가 잘못되었습니다. OpenGl을 잘 모르기 때문에 나는 당신을 도울 수 없다. 나는 많은 셰이더를 프로그래밍했지만 OpenGl/DirectX 레벨에서 일하지 않았다. 그러나 최소한 오류를 좁힐 수 있습니다. Shader와 Mesh가 적어도 정확하다는 것을 확신하도록 Rendermonkey로 Shader를 개발하거나 포트하는 것이 항상 좋은 출발입니다. – djmj