顶点的数量是否应该等于texCoords的数量?

时间:2013-02-23 06:27:51

标签: ios opengl-es shader

我的vertexShader:

attribute vec4 vertexPosition;
attribute vec2 vertexTexCoord;

varying vec2 texCoord;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * vertexPosition;
    texCoord = vertexTexCoord;
}

我的fragmentShder:

precision mediump float;
varying vec2 texCoord;

uniform sampler2D texSampler2D;

void main()
{
    gl_FragColor = texture2D(texSampler2D, texCoord);
}

Init Shader:

 if (shader2D == nil) {
    shader2D = [[Shader2D alloc] init];
    shader2D.shaderProgramID = [ShaderUtils compileShaders:vertexShader2d :fragmentShader2d];
    if (0 < shader2D.shaderProgramID) {
        shader2D.vertexHandle = glGetAttribLocation(shader2D.shaderProgramID, "vertexPosition");
        shader2D.textureCoordHandle = glGetAttribLocation(shader2D.shaderProgramID, "vertexTexCoord");
        shader2D.mvpMatrixHandle = glGetUniformLocation(shader2D.shaderProgramID, "modelViewProjectionMatrix");
        shader2D.texSampler2DHandle  = glGetUniformLocation(shader2D.shaderProgramID,"texSampler2D");
    }
    else {
        NSLog(@"Could not initialise shader2D");
    }
}
return shader2D;

渲染:

GLKMatrix4 mvpMatrix;
mvpMatrix = [self position: position];
mvpMatrix = GLKMatrix4Multiply([QCARutils getInstance].projectionMatrix, mvpMatrix);
glUseProgram(shader.shaderProgramID);
glVertexAttribPointer(shader.vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)vertices);
glVertexAttribPointer(shader.textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)texCoords);
glEnableVertexAttribArray(shader.vertexHandle);
glEnableVertexAttribArray(shader.textureCoordHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [texture textureID]);
glUniformMatrix4fv(shader.mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&mvpMatrix);
glUniform1i(shader.texSampler2DHandle, 0);
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, (const GLvoid*)indices);
glDisableVertexAttribArray(shader.vertexHandle);
glDisableVertexAttribArray(shader.textureCoordHandle);

当一个纹理坐标对应一个且只有一个顶点坐标(texCoords的数量== vertices的数量

时,它似乎正常工作

我的问题:openGL是否将纹理坐标分配给一个且只有一个顶点?换句话说,当纹理坐标和顶点坐标不是一一对应时,渲染结果会是什么?

1 个答案:

答案 0 :(得分:1)

是的,顶点和texCoords之间需要一对一的对应关系 - 从OpenGL管道向下传递的所有信息都是按顶点进行的,因此每个普通和每个texCoord都必须有一个顶点。

但请注意,您可以(并且经常需要)为空间中的相同点设置多个texCoords,法线或其他每顶点数据:例如如果你在一个球体周围包裹一个纹理贴图,那么矩形纹理的两端会有一个“缝”。在那些点,你需要有多个顶点占据相同的点。