2011-09-06 22 views
8

Shader'ları kullanabilmek için OpenGL ES 1 uygulamamı bir OpenGL ES 2 uygulamasına dönüştürmeye çalışıyorum. Şimdi glOrthof işlevini "gerçek boyutlu bir görünüm portuna" sahip olmak için kullanıyorum, böylece köşeleri OpenGL Görünümündeki "gerçek" piksele yerleştirebiliyorum.OpenGL ES 2.0'da glOrthof nasıl elde edilir

glOrthof(0, _frame.size.width, _frame.size.height, 0, -1, 1); 

ben OpenGL ES 2 içinde bunu başarmak için nasıl bulmak sorun yaşıyorum, bunun nasıl yapılacağını bana gösterebilir birisi var mı?

Değilse, iyi bir OpenGL ES 1 to OpenGL ES 2 öğretici/açıklama için bir bağlantı yok mu?

cevap

12

glOrtho yöntemi, yeni bir matris oluşturmak ve mevcut projeksiyon matrisini bu matrisle çarpmaktan başka bir şey yapmaz. OpenGL ES 2.0 ile matrisleri kendiniz yönetmek zorundasınız. glOrtho davranışını çoğaltmak için köşe gölgelendiricinizdeki yansıtma matrisi için bir formata ihtiyacınız vardır; glOrtho yapılar olabilir

uniform mat4 projection; 
uniform mat4 modelview; 

attribute vec4 vertex; 

void main() 
{ 
    gl_Position = projection * (modelview * vertex); 
} 

özel projeksiyon matrisi: Genellikle ayrıca bir modeli ve bir görünüm matrisi (ya da bir birleşik modelview matrisi, OpenGL ES 1 gibi) çıkıntı önce ile köşe dönüşümü sahip bulunan here.

+0

Projeksiyon ve model görünümünün nasıl oluşturulacağını/yükleneceğini bana gösterir misiniz? – Thys

+0

@MrThys Bundan emin değilseniz, öncelikle OpenGL ES 2.0 ve GLSL shader'larda bazı öğrenme kaynaklarına başvurmalısınız. Temel olarak, karşılık gelen tekdüze konumlara sahip olduğunuzda ve gölgelendirici program bağlandığında/kullanıldığında, değerlerini ['glUniform ...'] birinden biriyle ayarlayabilirsiniz (http://www.opengl.org/sdk/docs /man/xhtml/glUniform.xml), 'glUniformMatrix4fv' –

+0

' ı kullanacağınız matrisler durumunda, bağlantılar kesildi ... – B0rk4

10

Christian'ın belirttiği gibi, köşe noktalarınızı işlemek için tüm matris matematiği size kalmış, bu nedenle glOrthof()'un oluşturduğu matrisi çoğaltmanız gerekir. Sonra benim tepe içinde matrisi uygulanır

- (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)right bottom:(GLfloat)bottom top:(GLfloat)top near:(GLfloat)near far:(GLfloat)far; 
{ 
    GLfloat r_l = right - left; 
    GLfloat t_b = top - bottom; 
    GLfloat f_n = far - near; 
    GLfloat tx = - (right + left)/(right - left); 
    GLfloat ty = - (top + bottom)/(top - bottom); 
    GLfloat tz = - (far + near)/(far - near); 

    matrix[0] = 2.0f/r_l; 
    matrix[1] = 0.0f; 
    matrix[2] = 0.0f; 
    matrix[3] = tx; 

    matrix[4] = 0.0f; 
    matrix[5] = 2.0f/t_b; 
    matrix[6] = 0.0f; 
    matrix[7] = ty; 

    matrix[8] = 0.0f; 
    matrix[9] = 0.0f; 
    matrix[10] = 2.0f/f_n; 
    matrix[11] = tz; 

    matrix[12] = 0.0f; 
    matrix[13] = 0.0f; 
    matrix[14] = 0.0f; 
    matrix[15] = 1.0f; 
} 

Burada kullanılan matris

GLfloat orthographicMatrix[16]; 

olarak tanımlanır: cevabım here olarak, böyle bir izdüşümleri matris oluşturmak için aşağıdaki Amaç-Cı usul sağlanmaktadır

gl_Position = modelViewProjMatrix * position * orthographicMatrix; 

Benim çarpma sırası Christian'ın farklıdır, bu yüzden biraz bir şeyler yapıyor olabilir: shader aşağıdaki gibi kullanarak Buraya koydum, ama bunu OpenGL ES 2.0 uygulamasında kullanıyorum (kaynak kodu here bulunabilir).

+0

Yönteminiz, glOrthof man sayfası tarafından verilen formüle tam olarak uyuyor (örn. Http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml) – Tommy

+2

Ortografik matris aslında yansıtma matrisi ancak 'modelViewProjMatrix' adı, kavramsal olarak biraz garip olan başka bir projeksiyon matrisine sahip olduğunuzu gösterir (geçerli olsa da, gölgelendiricilerle mümkün olmayan). Ama gerçekten garip olan şey, sol uygulamayı matris dönüşümlerinin doğru uygulamalarıyla vektörlere karıştırmanızdır. Ve bu, 'loadOrthoMatrix' rutininizde aktarılan matrisi gerçekten oluşturmanızın sebebidir (ve bu gölgelendirici kodun matris dönüşümleri içine değil, kimseye karıştırılmasına neden olan sebep). –

+0

@Christian - Matris matematiğinin benim güçlü alanlarından biri olmadığını söyleyebilirsin. Gölgelendiricinin isimlendirmesi başka bir uygulamadan kalmıştır ve gerçekten ilk bileşen için sadece model görünüm matrisi olmalıdır. Bunun iki haklı bir hak olduğunu düşündüm, ama denediğimde işe yaradı, bu yüzden neden hiç sorgulamadım. Buradaki tuhaflıkları işaret ettiğin için teşekkürler. –