2011-08-20 8 views
5

Vertex shader'ımdaki bir Projeksiyon matrisini değiştirmek için opengles belgelerinden http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html
kendi glOtho işlevimi uygulamaya çalışıyorum. Şu anda basit üçgenler köşelerini yerinde görmediğim için düzgün çalışmıyor. Lütfen aşağıdaki kodu kontrol edip yanlış şeyler yapıp yapmadığımı kontrol edebilir misiniz?Nasıl opengles 2.0 için glOrtho uyguluyorsunuz? GlOrtho özelliklerinden tx, ty, tz değerleri ile veya olmadan?

tx, ty ve tz'yi 0'a ayarlamayı denedim ve bu işlemin düzgün yapılmasını sağladı. Herhangi bir fikir neden böyle olur?

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 gölgelendirici

attribute vec4 Position; 
uniform mat4 Projection; 
void main(void){ 
    gl_Position = Projection*Position; 
} 

Çözüm Ben böylece benim matrisi modifed ve düzgün

float ortho[16] = { 
    a, 0, 0, 0, 
    0, b, 0, 0, 
    0, 0, c, 0, 
    tx, ty, tz, 1 
}; 

Önemli not Sen kullanamaz hale gibiydi aşağıda Nicols cevap itibaren GlUniform için transgen argümanı için GL_TRUE altında. opengles bunu desteklemiyor. Bu değerler tek tip değişken yüklenir matrisi devrik olup belirtir devrik http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml

kaynaktan GL_FALSE

glUniformMatrix4fv(projectionUniform, 1, GL_TRUE, &ortho[0]); 

olmalıdır. GL_FALSE olmalı.

cevap

4

OpenGL'deki matrisler, sütun büyüklüğündedir. GL_TRUE, glUniformMatrix4fv'ye üçüncü parametre olarak geçmediğiniz sürece, matris, niyetinize göre etkili bir şekilde aktarılır.

+0

Teşekkürler. şimdi uni =) 'da bir kez duyduğumu hatırlıyorum. GL_TRUE ayarı çalışmadı ama matrisin alt kısmına tx, ty, tz değerleri taşındı. – valmo

+0

Auto-transpoz matrisi üniformaları OpenGL ES 2.0'da desteklenmiyordu - siz [her zaman GL_FALSE geçirmelisiniz] (https: //www.khronos. glUniformMatrix işlevleri 'transpoze parametresi olarak org/opengles/sdk/docs/man/xhtml/glUniform.xml). –

İlgili konular