2016-03-20 19 views
0

Ben opengl es 2 kullanıyorum ve dokulu dörtlü işlemek için optimize edilmiş bir gölgelendirici oluşturmaya çalışıyorum.Opengl/glsl, dörtlü çizim için bir gölgelendirici yazmaya çalışıyor ancak ekranın en boy oranında değişiklikleri nasıl gerçekleştireceğinden emin değilsiniz.

vert shader: Benim programda

attribute float vertIndex; 

uniform vec4 verts[4] = vec4[](vec4(-1,-1,0,1), vec4(-1,1,0,1), vec4(1,1,0,1), vec4(1,-1,0,1)); 
uniform vec2 texCoords[4] = vec2[](vec2(0,0), vec2(0,1), vec2(1,1), vec2(1,0)); 
uniform vec2 size(0,0); //size of the quad about to be rendered 
uniform vec2 translation(0,0); //position of the quad about to be rendered 

varying vec2 TexCoordOut; 

void main() { 
    vec2 vert = verts[int(vertIndex)]; 
    vert.x *= size.x; 
    vert.y *= size.y; 
    vert.x += translation.x; 
    vert.y += translation.y; 

    gl_Position = vert; 
    TexCoordOut = texCoords[int(vertIndex)]; 
} 

ben x hep -1,1 olacak ve y ekranın en boy oranına göre ayarlanabilir, böylece ayarlanmış ekran sınırlar içermez. Sorun, glsl'deki ekran sınırlarının her zaman -1,1,1, -1 olmasıdır. Bunu nasıl halledebilirim? Ayrıca, indeksler için imzasız chars yerine şamandıralar kullanıyorum çünkü vert gölgelendiriciye mürekkepleri aktarmaya çalıştığımda düzgün çalışmadı. Opengl es 2 ile bunu yapmak için bir çalışma yolu var mı?

Teşekkürler :).

cevap

1

Sadece GLES 2.0'da tamsayı nitelikleri yoktur, kayan nokta özniteliklerini kullanmanın bir yolu yoktur. Aslında, donanım GLES2 hedefleri, gölgelendirici çekirdeklerinde tamsayıya bile sahip olmayabilir ve uygulama, int'u kullandığınızda, yalnızca başlık altındaki kayan nokta türlerini kullanabilir. Bu tür yerleşik GPU'lar için hiç sık rastlanılmayacaktır. adanmış tamsayı ALU'lar.

açık bir şekilde bu gibi bir uygun kayan nokta türüne göre bir inttam gösterilebilen hale getirmek için float s ve int s hassas gereksinimlerini tanımlayan Spektroskopisi GLSL ES. (GLES2 için gölgeleme dili) GLSL_ES Shading Language Specification, Version 1.0 Bölüm 4.5.1 belirtmektedir:

yüksek ve orta hassasiyetleri için

, tam sayı aralıkları da doğru mukabil kayan nokta değeri ile temsil edilebileceği şekilde olmalıdır aynı hassas niteleyici. Yani, bir highp int, bir highp float tarafından temsil edilen olabilir, bir mediump int bir mediump float tarafından temsil edilebilir. Bununla birlikte, lowp int , bir lowp float;

O zaman hem bir mediump float tarafından reprsented edilebilir olarak lowp int, lowp float ile temsil edilemeyeceğini fark etmez. Buradaki kritik nokta, bir highp int'un bile her zaman mevcut bir kayan nokta tipi ile temsil edilebilmesidir, yani herhangi bir int kanunu olabilir.

+0

Teşekkürler :). +1'e 15 itibar puanına ihtiyacım var diyor, bunu yapamam. Afedersiniz. – Holden

0

Bu yüzden, gölgelendiricinin ekranın y sınırlarını tutan ve glsl'de uygun bir y koordinatı alabilmem için bir formata sahip olduğumu farkettim (1/screenYBounds) * vert.x. Yine de, inters/unsigned chars'ları yanıtlayan gölgelendiriciye aktarmakla ilgili diğer bir soru istiyorum. Teşekkürler :).

İlgili konular