努力的小马鸭 2020-11-03 10:22 采纳率: 0%
浏览 51

为什么用openGL绘制多边形,会出现缺角的情况???

图片说明

GLuint loadTexture(Image* image) {
    GLuint textureId;
    glGenTextures(1, &textureId);//创建一个对象ID
    glBindTexture(GL_TEXTURE_2D, textureId);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height, 0, GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
    return textureId;
}

void init() {
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    Image* image = loadBMP("f3.bmp");
    _textureId = loadTexture(image);
    delete image;
}

void changesize(int w,int h) {
    float ratio;
    if (h == 0) h = 1;
    ratio = 1.0 * w / h;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, w, h);
    gluPerspective(65, ratio, 1, 200);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0f, 1.75f, 20.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
}

void renderScene() {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
    //创建一个域空间
    {
    glColor3f(0.0f, 0.0f, 1.0f);
    glBegin(GL_QUADS);
    glVertex3f(-20.0f, -2.5f, -20.0f);
    glVertex3f(20.0f, -2.5f, -20.0f);
    glVertex3f(-20.0f, -2.5f, 20.0f);
    glVertex3f(20.0f, -2.5f, 20.0f);
    glEnd();
    }
    //设置值光源
    {
        GLfloat sun_light_position[] = {10.0f,5.0f,5.0f,1.0f};
        GLfloat sun_light_ambient[] = {0.0f,0.0f,0.0f,1.0f};
        GLfloat sun_light_diffuse[] = {1.0f,1.0f,1.0f,1.0f};
        GLfloat sun_light_specular[] = {1.0f,1.0f,1.0f,1.0f};

        glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
        glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);
        glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);

    }
    //进行纹理映射
    {
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, _textureId);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
        glColor3f(1.0f, 1.0f, 1.0f);

        glBegin(GL_QUADS);
        glNormal3f(0.0f,0.0f,1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f,-2.5f,-2.5);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(2.5f,-2.5f,-2.5f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f, 2.5f, -2.5f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(2.5f, 2.5f, -2.5f);
        glEnd();
        /*glBegin(GL_TRIANGLES);

        glNormal3f(0.0f, 0.0f, 1.0f);
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-2.5f, -2.5f, -2.5f);
        glTexCoord2f(0.5f, 1.0f);
        glVertex3f(0.0f, 2.5f, -2.5f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(2.5f, -2.5f, -2.5f);

        glEnd();*/
    }
    glutSwapBuffers();
    glFlush();
}

//先创建一个平台
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowPosition(200, 200);
    glutInitWindowSize(500, 500);
    glutCreateWindow("小马鸭");
    init();//负责开启各种功能

    glutDisplayFunc(&renderScene);
    glutReshapeFunc(changesize);
    glutIdleFunc(&renderScene);
    glutMainLoop();
    return 0;
}
  • 写回答

1条回答 默认 最新

  • wlj1234 2020-11-04 08:19
    关注
      glVertex3f(-20.0f, -2.5f, -20.0f);
        glVertex3f(20.0f, -2.5f, -20.0f);
        glVertex3f(-20.0f, -2.5f, 20.0f);
        glVertex3f(20.0f, -2.5f, 20.0f);
    

    顶点顺序有错误,最后两行交换一下位置

      glVertex3f(-20.0f, -2.5f, -20.0f);
        glVertex3f(20.0f, -2.5f, -20.0f);
             glVertex3f(20.0f, -2.5f, 20.0f);
        glVertex3f(-20.0f, -2.5f, 20.0f);
    
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值