OpenGL: gl_ClipDistance i gl_CullDiatance

Opengl Gl_clipdistance



Usuari après a retallar i pre-tallar a OpenGL i va registrar l’ús de gl_ClipDistance i gl_CullDiatance
gl_ClipDiatance: la distància de retallada de sortida s'interpolarà linealment amb la primitiva, la distància d'interpolació Menys de 0 , doncs Part primitiva Serà tallat.
gl_CullDiatance: si el primitiu tot Vèrtex a pla Tots Tornat nombre negatiu Cal retallar el valor de la distància de retall de, i la primitiva.
Utilitzeu el codi de la guia de programació OpenGL per modificar la prova:

#include #include 'vgl.h' #include 'LoadShaders.h' #include 'vmath.h' using namespace std struct Vertex { GLubyte color[4] GLfloat position[3] } Vertex Verts[9] = { { { 255,0, 0, 255 }, { 0.6f, 0.9f, 0.0f } }, { { 0, 255,0, 255 }, { -0.9f, -0.9f, 0.0f } }, { { 0, 0, 255,255 }, { 0.9f, -0.9f, 0.0f } }, { { 255,255,255,255 }, { 0.0f, 0.8f, -0.2f } }, { { 255,255,255,255 }, { -0.4f, 0.0f, -0.2f } }, { { 255,255,255,255 }, { 0.4f, 0.0f, -0.2f } }, { { 255,255,255,255 }, { 0.3f, 0.0f, -0.2f } }, { { 255,255,255,255 }, { -0.4f, -0.8f, -0.2f } }, { { 255,255,255,255 }, { 0.4f, -0.8f, -0.2f } } } GLuint Program = 0 GLuint vert GLuint vbo void Init() { ShaderInfo si[] = { { GL_VERTEX_SHADER, 'Chpater05.vert' },{ GL_FRAGMENT_SHADER, 'Chapter05.frag' },{ GL_NONE, NULL } } Program = LoadShaders(si) glGenVertexArrays(1, &vert) glBindVertexArray(vert) glGenBuffers(1, &vbo) glBindBuffer(GL_ARRAY_BUFFER, vbo) glBufferData(GL_ARRAY_BUFFER, sizeof(Verts), Verts, GL_STATIC_DRAW) glVertexAttribPointer(0, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), BUFFER_OFFSET(0)) glEnableVertexAttribArray(0) glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(Verts->color))) glEnableVertexAttribArray(1) glClearColor(0.2f, 0.1f, 0.3f, 1.0f) glUseProgram(Program) glUniform4f(glGetUniformLocation(Program, 'Plane'), 0.0, 0.0, 0.0, 0.0) } void Display() { glClear(GL_COLOR_BUFFER_BIT) glBindVertexArray(vert) glEnable(GL_CLIP_DISTANCE0) glDrawArrays(GL_TRIANGLES, 0, 9) glutSwapBuffers() glutPostRedisplay() Sleep(30) } int main(int argc, char*argv[]) { glutInit(&argc, argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE |GLUT_STENCIL) glutInitWindowSize(400, 400) glutInitContextVersion(4, 3) glutInitContextProfile(GLUT_CORE_PROFILE) glutCreateWindow('Test OpenGL Chapter 04') if (glewInit()) { cout << 'Unable to Initialize GLEW.' << endl return 1 } Init() glutDisplayFunc(Display) glutMainLoop() return 0 }

Ombra de vèrtex:



#version 450 core layout(location = 0) in vec4 vColor layout(location = 1) in vec4 vPos uniform vec4 Plane out vec4 color void main() { gl_Position = vPos color = vColor // gl_ClipDistance[0] = Plane[3] - Plane[0]*vPos.x - Plane[1]*vPos.y - Plane[2]*vPos.z // gl_CullDistance[0] = Plane[3] - Plane[0]*vPos.x - Plane[1]*vPos.y - Plane[2]*vPos.z }

Fragment ombrejat:



#version 450 core in vec4 color out vec4 fColor void main() { fColor = color }

En circumstàncies normals:
imatge
Obriu el comentari del codi d'assignació gl_CullDistance i configureu el pla de retall a:



glUniform4f(glGetUniformLocation(Program, 'Plane'), 0.0, 0.0, 1.0, -0.1)

imatge
El triangle més gran que va canviar el color va desaparèixer. Això es deu al fet que els valors Z dels tres vèrtexs d’aquest triangle són tots 0. Després del càlcul, els valors gl_CullDistance dels tres vèrtexs són tots inferiors a 0

Obriu el comentari de gl_ClipDistance, comenteu gl_CullDistance i configureu el pla de retall a:

glUniform4f(glGetUniformLocation(Program, 'Plane'), 0.0, 1.0, 1.0, 0.1)

imatge