加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OpenGL拒绝绘制三角形

发布时间:2020-12-16 07:11:59 所属栏目:百科 来源:网络整理
导读:我试图在OpenGL的窗口中绘制一个大的三角形.我的程序编译并运行,但我的窗口只有一个黑屏. 我已经检查并仔细检查了多个教程,看起来我的步骤是正确的……我错过了一些明显的东西吗? 以下是该计划的全部内容: #include stdlib.h#include stdio.h#include GL/g
我试图在OpenGL的窗口中绘制一个大的三角形.我的程序编译并运行,但我的窗口只有一个黑屏.

我已经检查并仔细检查了多个教程,看起来我的步骤是正确的……我错过了一些明显的东西吗?

以下是该计划的全部内容:

#include <stdlib.h>
#include <stdio.h>
#include <GL/glew.h>
#include <GLUT/glut.h>

GLuint VBO;

struct vector {
  float _x;
  float _y;
  float _z;
  vector() { }
  vector(float x,float y,float z) { _x = x; _y = y; _z = z; }
};

void render()
{
  glClear(GL_COLOR_BUFFER_BIT);

  glEnableVertexAttribArray(0);
  glBindBuffer(GL_ARRAY_BUFFER,VBO);
  glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0);

  glDrawArrays(GL_TRIANGLES,3);

  glDisableVertexAttribArray(0);

  glutSwapBuffers();
}

void create_vbo()
{
  vector verts[3];
  verts[0] = vector(-1.0f,-1.0f,0.0f);
  verts[1] = vector(1.0f,0.0f);
  verts[2] = vector(0.0f,1.0f,0.0f);

    glGenBuffers(1,&VBO);
    glBindBuffer(GL_ARRAY_BUFFER,VBO);
    glBufferData(GL_ARRAY_BUFFER,sizeof(verts),verts,GL_STATIC_DRAW);
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(1024,768);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Triangle Test");
    glutDisplayFunc(render);

    glewInit();

    glClearColor(0.0f,0.0f,0.0f);

    create_vbo();
    glutMainLoop();

    return 0;
}

更新:事实证明,没有“程序”(即编译的着色器文件)以这种方式绘制会产生未定义的行为(您的图形卡越新,它就越有可能工作).

因为我的卡是正确的,并且只支持OpenGL 2.1,所以找到一个合适的着色器示例有点困难 – 似乎在OpenGL的演变过程中不同阶段有很多不同的教程.

我的顶点着色器(整个文件):

void main()
{
  gl_Position = ftransform();
}

我的片段着色器(整个文件):

void main()
{
    gl_FragColor = vec4(0.4,0.4,0.8,1.0);
}

我使用了this OpenGL Tutorial Site的LoadShaders函数来创建程序,现在,我也可以看到三角形!

(感谢@ chbaker0指出我正确的方向.)

解决方法

我不知道这是否会对你有所帮助,但在你的create_vbo()函数中你有:

glBufferData(GL_ARRAY_BUFFER,GL_STATIC_DRAW);

试试这个:

glBufferData( GL_ARRAY_BUFFER,sizeof( verts[0] * 3 ),&verts[0],GL_STATIC_DRAW );

在此函数调用之后,将此函数调用添加到create_vbo()函数的末尾

// This MUST BE LAST! Used to Stop The Buffer!
glBindBuffer( GL_ARRAY_BUFFER,0 );

我很难看到你的错误.在我的项目中,我确实有一些vbos,但我也使用vaos.我的代码能够在OpenGL 2.0 – 4.5中工作,但是对于旧版本,由于API中已弃用的功能,因此逻辑上存在分歧.我也不使用过剩.我希望这有帮助.

我注意到的另一件事是你注意你的顶点缠绕顺序吗?这意味着OpenGL在CCW订单或CW订单中使用它们?背面剔除是打开还是关闭?在设置和配置OpenGL上下文时,需要考虑很多元素.自从我使用旧版本的OpenGL以来已经有一段时间了,但我知道一旦你开始使用特定版本或更新版本,你将不得不提供自己的模型视图投影矩阵,这是需要考虑的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读