OpenGL:gl_ClipDistanceおよびgl_CullDiatance



Opengl Gl_clipdistance



OpenGLでのユーザーのトリミングと事前カットについて学び、gl_ClipDistanceとgl_CullDiatanceの使用法を記録しました。
gl_ClipDiatance:出力クリッピング距離は、プリミティブである補間距離で線形補間されます。 0未満 、その後 原始的な部分 切断されます。
gl_CullDiatance:プリミティブの場合 すべて 頂点から平面へ すべて 戻ってきた 負の数 のクリッピング距離値、次にプリミティブをクリッピングする必要があります。
OpenGLプログラミングガイドのコードを使用して、テストを変更します。

#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 }

頂点シェーダー:



#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 }

フラグメントシェーダー:

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

通常の状況下で:
画像
gl_CullDistance割り当てコードのコメントを開き、クリッピング平面を次のように設定します。



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

画像
最大の色が変わる三角形が消えました。これは、この三角形の3つの頂点のZ値がすべて0であるためです。計算後、3つの頂点のgl_CullDistance値はすべて0未満です。

gl_ClipDistanceのコメントを開き、gl_CullDistanceをコメントアウトして、クリッピング平面を次のように設定します。

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

画像