2017-04-25 3 views
1

Ich bin neu in OpenGL und versuche, meinen Fragment-Shader herauszufinden. Ich habe ein Rechteck in mein Fenster gezeichnet, und ich möchte die obere Hälfte davon in einer anderen Farbe (etwa blau) färben, ohne die Höhe der Pixel fest zu codieren.Fenstergröße in GLSL für OpenGL?

Mit einer Fensterhöhe von 1000, in meinen Fragment-Shader, die ich habe:

void main(){ 
if((gl_FragCoord.y) > 500) 
{ 
    color = vec3(.3, .3, 1); 
} 
else 
{ 
    color = fragmentColor; 
} 

Welche Farben die obere Hälfte des Rechteck blau. Aber was wäre, wenn ich die Fensterhöhe von innerhalb meines Fragment-Shaders erhalten möchte anstatt nur 500 Pixel zu verwenden? Ich initialisierte uniform vec2 windowSize, und versuche, glUniform1i() zu verwenden, um die Fensterhöhe in dieser Variablen zu platzieren, aber ich weiß nicht wie.

+1

Sie müssen 'glUniform2f' verwenden, um' windowSize' zu ​​setzen, da es sich um 'vec2' handelt. – rwols

+0

Wie kann ich den Aufruf in meinem Fragment-Shader durchführen? Ist es glUniform2f (windowSize,?,?)? Wie soll ich die anderen beiden Argumente weitergeben? – 3PA

+0

Sie erhalten zuerst einen "Handle" für die einheitliche Variable über ['glGetUniformLocation'] (https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glGetUniformLocation.xhtml), und verwenden Sie dann diese "handle" als erstes Argument für 'glUniform2f'. Das zweite und dritte Argument für 'glUniform2f' kann beliebig sein. – rwols

Antwort

0

Die Situation, die Sie beschreiben, bittet nur um eine out float Variable im Vertex-Shader, die auf die aktuelle Y-Koordinate des Rechtecks ​​eingestellt ist. Diese wird zusammen mit der X-Koordinate und allen anderen Vertex-Attributen an Ihren Shader übergeben von OpenGL.

Wenn es am Fragment-Shader ankommt (der Typ ist in float), wird es interpoliert, am wahrscheinlichsten in [–1; 1] Grenzen. Also, um die obere Hälfte blau zu malen, müssen Sie nur überprüfen, ob diese Variable positiv ist.

N. B .: wenn Sie GLSL vor der Verwendung 3.x, out float VARIABLE_NAME und in float VARIABLE_NAME müssen beide varying float VARIABLE_NAME.