0

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

1つのテクスチャ座標が1つの頂点座標に対応している場合は正しく機能しているようです(Number of texCoords== Number of vertices

私の質問:openGLはテクスチャ座標を1つだけの頂点に割り当てますか?つまり、テクスチャ座標と頂点座標が1対1で対応していない場合、レンダリング結果はどうなるでしょうか。

4

1 に答える 1

1

はい、頂点と texCoords の間には 1 対 1 の対応が必要です。OpenGL パイプラインを通過するすべての情報は頂点ごとであるため、すべての法線とすべての texCoord に頂点が必要です。

ただし、空間内の同じ点に対して複数の texCoords、法線、またはその他の頂点ごとのデータを持つことができる (そしてしばしば必要になる) ことに注意してください。たとえば、球の周りにテクスチャ マップをラップしている場合、長方形のテクスチャの端が交わる「継ぎ目」。これらのスポットでは、同じポイントを占める複数の頂点が必要になります。

于 2013-02-23T07:11:30.727 に答える