2017-04-07 2 views
0
const GLchar* vertexSource1 = "#version 330 core\n" 
    "layout (location = 0) in vec2 position;\n" 
    "layout (location = 1) in vec3 color;\n" 
    "out vec3 Color;\n" 
    "void main()\n" 
    "{\n" 
    "gl_Position = vec4(position, 0.0, 1.0);\n" 
    "Color = color;\n" 
    "}\0"; 
const GLchar* fragmentSource1 = "#version 330 core\n" 
" in vec3 Color;\n" 
" out vec4 outColor;\n" 
" void main()\n" 
" {\n" 
"  outColor = vec4(Color, 1.0);\n" 
" }\n"; 


GLuint shaderProgram1 = glCreateProgram(); 
glAttachShader(shaderProgram1, vertexShader1); 
glAttachShader(shaderProgram1, fragmentShader1); 
// glBindFragDataLocation(shaderProgram1, 0, "Color"); 
glLinkProgram(shaderProgram1); 

Ob ich GLBindFragDataLocation hinzufügen oder nicht, funktioniert der GL richtig, warum?Warum glBindFragDataLocation kommentieren, der GL funktioniert auch richtig?

+0

Da 0 höchstwahrscheinlich der Standardspeicherort ist, wird die erste Ausgabevariable zugewiesen. Dafür gibt es (afaik) keine Garantie. – BDL

Antwort

2

Weil du "glücklich" bist. Die OpenGL-Spezifikation bietet keine Garantie dafür, wie Fragment-Shader-Ausgabestandorte zugewiesen werden, wenn Sie sie nicht zuweisen. Es sagt nur, dass jeder einen separaten Ort haben wird; Welche Standorte das sind, hängt von der Implementierung ab.

In Anbetracht der schieren Menge an Code, der in eine einzelne Ausgabevariable schreibt, ohne sie explizit einer Position zuzuordnen, ist es sehr unwahrscheinlich, dass eine OpenGL-Implementierung den ersten FS-Ausgabestandort jemals einem anderen Wert als 0 zuweist es ist keine Spezifikationsgarantie, an diesem Punkt ist es eine De-facto-Anforderung von Implementierungen.

Hinweis: Dies bedeutet nicht, dass Sie diesen Ort nicht manuell zuweisen sollten. Es ist immer am besten, auf der sicheren und expliziten Seite zu sein.

FYI: layout(location) funktioniert auch für Fragment Shader-Ausgaben. Sie sollten das also verwenden, wenn Sie es für Vertex-Attribute verwenden. Dann müssen Sie sich nicht darum sorgen, dass Sie es aus dem Code heraus tun.

Verwandte Themen