在现代OpenGL中,使用GL_TRIANGLE奇怪的z轴行为绘制填充圆

问题描述 投票:2回答:1

我正在尝试使用GL_TRIANGLE在现代的opengl中绘制实心圆。我正在填充圆形顶点的圆形数组,然后使用圆形顶点填充点数组以使用三角形中的顶点。我正在使用vec4(齐次坐标)并将顶点的z轴值设置为0.0,并使用默认投影每个轴的范围为-1至1。但是不知何故,我让所有屏幕都涂上了颜色,而不是圆形。奇怪的是,当我设定[0-0.4]范围以外的点的z轴值时,我可以画出圆,当我增加z的值时,它的作用就像透视图,无论我将半径设置为什么, z增大时变得越来越小。我不知道为什么z值会那样。

using namespace Angel;


const int NumVertices = 90;
const double PI = 3.141592653589793238463;

const GLint width = 500;
const GLint height = 500;

vec4 points[NumVertices];
vec4 colors[NumVertices];

vec4 circle[30];
vec4 color = { 1.0,0.0,0.0,1.0 };
vec4 center = { 0.0,0.0,0.0,1.0 };

GLfloat radius = 0.5;

int Index = 0;

void triangle(int b, int c) {
    colors[Index] = color; points[Index] = center; Index++;
    colors[Index] = color; points[Index] = circle[b%30]; Index++;
    colors[Index] = color; points[Index] = circle[c%30]; Index++;
}

void fill() {
    for (int i = 0; i < 30; i++)
    {
        float angle = 2 * PI * i / 30;
        vec4 point;
        point.x = center.x + (GLfloat)cos(angle) * radius;
        point.y = center.y + (GLfloat)sin(angle) * radius;
        point.z = 0.0 ; // PROBLEM !!
        circle[i] = point;
    }

    for (int i = 0; i <= 29; i++) {
        triangle(i, i + 1);
    }
}

void init()
{
    fill();

    // Create a vertex array object
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    // Create and initialize a buffer object
    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points) + sizeof(colors),
        NULL, GL_STATIC_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(points), points);
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(points), sizeof(colors), colors);

    // Load shaders and use the resulting shader program
    GLuint program = InitShader("vshader.glsl", "fshader.glsl");
    glUseProgram(program);

    // set up vertex arrays
    GLuint vPosition = glGetAttribLocation(program, "vPosition");
    glEnableVertexAttribArray(vPosition);
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0,
        BUFFER_OFFSET(0));

    GLuint vColor = glGetAttribLocation(program, "vColor");
    glEnableVertexAttribArray(vColor);
    glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0,
        BUFFER_OFFSET(sizeof(points)));

    glEnable(GL_DEPTH_TEST);
    glClearColor(1.0, 1.0, 1.0, 1.0);
}
void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glDrawArrays(GL_TRIANGLES, 0, NumVertices);

    glutSwapBuffers();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(width, height);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("PirateFace");
    glewExperimental = GL_TRUE;
    glewInit();

    init();

    glutDisplayFunc(myDisplay);
    glutMainLoop();
    return 0;
}

顶点着色器:

#version 150

in  vec4 vPosition;
in  vec4 vColor;
out vec4 color;

void main() 
{
  gl_Position = vPosition;
  color = vColor;
}

片段着色器:

#version 150

in  vec4 color;
out vec4 fColor;

void main() 
{ 
    fColor = color;
} 


c++ opengl glsl glut
1个回答
0
投票

我正在使用vec4(同质坐标)

您需要将w值的vec4分量正确初始化为1.0

请注意,在大多数情况下,您不需要在输入顶点数组中存储同构坐标。您可以将in vec4保留在顶点着色器中,仅使用3维矢量作为输入,并且GL会自动将矢量扩展到(x,y,z,1)

© www.soinside.com 2019 - 2024. All rights reserved.