2016-03-20 24 views
0

Ich benutze OpenGLES 2 und ich versuche, einen Shader zu erstellen, der für texturierte Quads optimiert wurde.OpenGL/GLSL versucht, einen Shader zum Zeichnen von Quads zu schreiben, aber nicht sicher, wie man Änderungen im Seitenverhältnis des Bildschirms behandelt

vert Shader:

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)]; 
} 

In meinem Programm habe ich die Bildschirm Grenzen gesetzt, so dass die x immer -1,1 sein wird, und die y wird basierend auf dem Seitenverhältnis des Bildschirms eingestellt werden. Das Problem ist, dass die Bildschirmgrenzen in Glsl immer -1,1,1, -1 sind. Wie gehe ich damit um? Außerdem verwende ich Floats anstelle von nicht signierten Zeichen für die Indizes, da es beim Versuch, Ints auf den Vert-Shader zu übertragen, nicht richtig funktioniert hat. Gibt es einen funktionierenden Weg, dies mit OpenGLES 2 zu tun?

Danke :).

Antwort

1

In GLES 2.0 gibt es keine Integer-Attribute, es gibt keine Möglichkeit, Fließkommaattribute zu verwenden. Tatsächlich haben die GLES2-Ziele der Hardware möglicherweise gar keine Unterstützung für Integer in den Shader-Kernen, und die Implementierung verwendet unter Umständen nur Fließkommatypen unter der Haube, wenn Sie int verwenden - es wäre nicht ungewöhnlich, dass solche eingebetteten GPUs keine haben dedizierte Ganzzahl-ALUs überhaupt.

Die GLSL ES spec explizit die Genauigkeitsanforderungen für float s definiert und int s wie machen jede intgenau darstellbare durch einen verfügbaren Typ Gleitpunkt. Abschnitt 4.5.1 der GLSL_ES Shading Language Specification, Version 1.0 (die die Schattierung Sprache für GLES2 ist) heißt es:

für hohe und mittlere Genauigkeiten, integer Bereiche müssen so beschaffen sein, dass sie genau durch der entsprechenden Fließkommawert der dargestellt werden gleicher Präzisionsqualifikator. Das heißt, ein highp int kann repräsentiert durch einen highp float, ein mediump int kann durch einen mediump float repräsentiert werden. lowp int kann jedoch nicht durch lowp float dargestellt werden;

Es spielt keine Rolle, dass lowp int nicht durch lowp float dargestellt werden, wie es immer von einem mediump float auch reprsented werden kann. Der kritische Punkt hier ist, dass auch ein highp int immer durch einen verfügbaren Gleitkommatyp dargestellt werden kann, dh beliebige int kann.

+0

Danke :). Es sagt, ich brauche 15 Rufpunkte zu +1, also kann ich das nicht tun. Es tut uns leid. – Holden

0

Also erkannte ich, dass ich eine Uniform in dem Shader haben kann, die die y-Grenzen des Bildschirms hält und eine geeignete y-Koordinate in glsl bekomme ich nur (1/screenYBounds) * vert.x. Ich möchte immer noch, dass die andere Frage zum Übertragen von Ints/unsignierten Zeichen an den Shader beantwortet wird. Vielen Dank :).