2017-05-14 2 views
2

Ich frage mich, was zu Daten geschieht, die ohne Informationen, ex gesendet wird:Was macht openGL mit leeren/nicht initialisierten Daten?

struct Vertex 
{ 
    glm::vec3 Positions, UVs, Normals; 
}; 

std::vector<Vertex> vertices; 
// We fill vertices with a bunch of Vertex' that only have Positions and UVs filled in. 
// Normals aren't iniatalized so im assuming they're a glm::vec3(0.0f,0.0f,0.0f) by default 

später im Code, während die Puffer schaffen wir die Daten senden, weisen wir die Puffer mit einer Größe von sizeof(Vertex) * vertices[0] zu haben.

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<GLvoid*>(offsetof(Vertex, Positions))); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<GLvoid*>(offsetof(Vertex, UVs))); 
glEnableVertexAttribArray(2); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<GLvoid*>(offsetof(Vertex, Normals))); 

Was ist der Shader mit den Vertex::Normal Daten in jedem der beiden Fälle, in Shadern tun:

1.)

#version 450 core 
layout(location = 0) in vec3 Pos; 
layout(location = 1) in vec3 UVs; 
layout(location = 2) in vec3 Norms; 
void main() 
{ 
    // We only use Pos and UVs, Norms is never referenced. 
} 

2.)

#version 450 core 
layout(location = 0) in vec3 Pos; 
layout(location = 1) in vec3 UVs; 
void main(){...} 

1 .) Zum einen erwarte ich, dass der Shader das nicht initialisierte vec3 von Norms speichert, da wir ihm eine Lok geben um die Daten abzurufen. Aber ich habe auch gehört, dass Shader alle Daten löschen, die nicht verwendet werden.

2.) Ich erwarte, dass die vec3 Normen verworfen werden, da es noch keine Stelle im Shader hat, obwohl ich die Daten durch die noch glVertexAttribArray(...)

Danke für die Hilfe schicken!

Antwort

3

Was auch immer passiert ist nicht beobachtbar Verhalten. Das heißt, Sie können nichts tun, um zu testen, was passiert. Selbst Leistungstests sind nicht schlüssig, was passiert.

Die OpenGL-Spezifikation sagt, dass es legal ist, Attribute zu übergeben, die nie von der VS verwendet werden (entweder weil Sie nie die Variable verwenden, die sie abfängt oder keine Variable abfängt). Aber ob irgendein internes Register mit einem Wert geladen wird oder nicht, ist einfach nicht etwas, was wir wissen können.

Wenn die wirkliche Frage, die Sie stellen, ist, "ist es wert, meinen VAO zu ändern, wenn ein Shader, den ich damit verwenden möchte, keinen Wert erfasst", lautet die Antwort im Allgemeinen "nein" . Vor allem mit Ihren verschachtelten Vertex-Daten, da die GPU immer noch alle diese Daten in den Pre-T & L Cache holt.

Änderungen am VAO-Vertexformat sind nicht trivial. Shader-Änderungen sind auch nicht billig, aber Sie wollen nicht beides. Auf einer Hardware wird beides nicht schlimmer sein als das eine oder das andere, aber auf einer Hardware wird es schlimmer.