6

CG (Fach) / Cube Maps (Lektion)

-

Diese Lektion wurde von Missunderstand erstellt.

Lektion lernen

Diese Lektion ist leider nicht zum lernen freigegeben.

  • Client-Seite: // Anlegen der Textur glGenTextures(1, $m_textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, m_textureID); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR) // enstprechend auch alle anderen Parameter... // Übertragung der Daten gltexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, internalFormat, m_width, m_height, 0,internalFormat, GL_UNSIGNED_BYTE, data[i]); 
  • Code vom Vertex-Shaderder Cube Map: Die Texturkoordinate wird als 3D Koordinate aus der Position gesetzt. Bei der View-Matrix darf die Translation nicht ausgeführt werden, damit sich die Kamera im Zentrum der Welt befindet. layout (location = 0) in vec4 position; uniform mat4 viewMatrix; uniform mat4 projectionMatrix; out vec3 passTexCoord; void main() { passTexCoord = postion.xyz; mat4 vM = mat4(mat3(viewMatrix)) // keine Translation gl_Position = projectionMatrix * vM * postion; } 
  • Fragment-Shader: Das projizieren der Cube-Map auf einen Würfel ergibt eine Skybox. in vec3 passTexCoord; uniform samplerCube cubeMap; out vec4 fragmentColor; void main(){ fragmentColor = texture(cubeMap, passTexCoord); } 
  • Reflexion Um Spiegelungen zu simulieren wird die Cube-Map, d.h. 6 Bilder (in jede Richtung eins) verwendet. Die größte Komponente des Reflexionsvektors ergibt automatisch die Fläche mit der geschnitten werden muss. Normiert man durch diese Koordinate erhält man direkt die Schnittkoordinaten. Die Reflexion berechnet sich über r = v - 2(n ° v)n  (imShaderüber reflect(v,n) ). 
  • Code Vertex-Shader: Cube Map layout (location = 0) in vec4 position; layout (location = 1) in vec3 normal; uniform mat4 modelMatrix; uniform mat4 viewMatrix;uniform mat4 projectionMatrix;+out vec4 passPosition;out vec3 passReflectionNormal; void main() { passPosition = viewMatrix * modelMatrix * position; passReflectionNormal = vec3(transpose(inverse(viewMatrix * modelMatrix))* vec4(normal, 0)); gl_Position = projectionMatrix * viewMatrix * modelMatrix * position; } 
  • Code Fragment Shader Reflexion in vec4 passPosition; in vec3 passReflectionNormal; uniform samplerCube cubeMap; uniform mat4 viewMatrix; out vec4 fragmentColor; void main(){ vec3 pos = normalize(vec3(passPosition)); vec3 normal = normalize(passReflectionNormal); vec3 reflected = reflect(pos, normal); reflected = vec3(inverse(viewMatrix) * vec4(reflected, 0.0)); fragmentColor = texture(cubeMap, reflected); } 
Anzeige