Sto cercando di implementare la mia funzione glOtho dai documenti opengles http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html
per modificare una matrice di Proiezione nel mio vertex shader. Al momento non funziona correttamente perché vedo i miei vertici triangolari semplici fuori luogo. Puoi controllare il codice qui sotto e vedere se sto facendo le cose sbagliate.Come implementate glOrtho per opengles 2.0? Con o senza tx, ty, tz valori dalle specifiche glOrtho?
Ho provato a impostare tx, ty e tz su 0 e sembra che lo renda correttamente. Qualche idea perché dovrebbe essere così?
void ES2Renderer::_applyOrtho(float left, float right,float bottom, float top,float near, float far) const{
float a = 2.0f/(right - left);
float b = 2.0f/(top - bottom);
float c = -2.0f/(far - near);
float tx = - (right + left)/(right - left);
float ty = - (top + bottom)/(top - bottom);
float tz = - (far + near)/(far - near);
float ortho[16] = {
a, 0, 0, tx,
0, b, 0, ty,
0, 0, c, tz,
0, 0, 0, 1
};
GLint projectionUniform = glGetUniformLocation(_shaderProgram, "Projection");
glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]);
}
void ES2Renderer::_renderScene()const{
GLfloat vVertices[] = {
0.0f, 5.0f, 0.0f,
-5.0f, -5.0f, 0.0f,
5.0f, -5.0f, 0.0f};
GLuint positionAttribute = glGetAttribLocation(_shaderProgram, "Position");
glEnableVertexAttribArray(positionAttribute);
glVertexAttribPointer(positionAttribute, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(positionAttribute);
}
Vert Shader
attribute vec4 Position;
uniform mat4 Projection;
void main(void){
gl_Position = Projection*Position;
}
Soluzione Da Nicols risposta qui sotto ho modifed mia matrice come così e mi sembrava il rendering corretto
float ortho[16] = {
a, 0, 0, 0,
0, b, 0, 0,
0, 0, c, 0,
tx, ty, tz, 1
};
Nota importante Non è possibile utilizzare GL_TRUE per argomento transpose per glUniform as sotto. opengles non lo supporta. deve essere GL_FALSE
glUniformMatrix4fv(projectionUniform, 1, GL_TRUE, &ortho[0]);
Da http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml
trasposizione Specifica se recepire la matrice i valori vengono caricati nella variabile uniforme. Deve essere GL_FALSE.
grazie. ora ricordo di averlo sentito una volta su uni =). l'impostazione di GL_TRUE non ha funzionato, ma spostando i valori tx, ty, tz nella parte inferiore della matrice ha fatto – valmo
Le uniformi di matrice Auto-trasposizione non sono supportate in OpenGL ES 2.0 - è necessario [passare sempre GL_FALSE] (https: //www.khronos. org/opengles/sdk/docs/man/xhtml/glUniform.xml) come parametro di trasposizione delle funzioni glUniformMatrix. –