Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;OpenGL:三角形不会出现在屏幕上_C++_Opengl - Fatal编程技术网

C++ C++;OpenGL:三角形不会出现在屏幕上

C++ C++;OpenGL:三角形不会出现在屏幕上,c++,opengl,C++,Opengl,我正在学习使用OpenGL在屏幕上绘制三角形的教程。我已经正确地遵循了所有步骤,但我只得到了一个绿色屏幕,没有三角形 这是我当前的代码。在应用程序初始化期间调用DrawScene,并在每次WM_DRAW时调整场景大小。 我的问题是:为什么我的代码中没有显示三角形 OpenGL版本:4.6 #包括“glew.h” GLuint程序; GLuint VAO、VBO、EBO; 虚空绘制场景(HWND _HWND); void SetupShaders() { 常量字符*顶点源={ “#版本130核心\

我正在学习使用OpenGL在屏幕上绘制三角形的教程。我已经正确地遵循了所有步骤,但我只得到了一个绿色屏幕,没有三角形

这是我当前的代码。在应用程序初始化期间调用DrawScene,并在每次WM_DRAW时调整场景大小。 我的问题是:为什么我的代码中没有显示三角形

OpenGL版本:4.6

#包括“glew.h”
GLuint程序;
GLuint VAO、VBO、EBO;
虚空绘制场景(HWND _HWND);
void SetupShaders()
{
常量字符*顶点源={
“#版本130核心\n”
“vec3 iPos中的布局(位置=0);\n”
“void main()\n”
“{\n”
gl_位置=vec4(首次公开募股,1.0f);\n
“}\n”
"\0"
};
GLuint vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(顶点着色器,1和顶点源,NULL);
glCompileShader(顶点着色器);
常量字符*碎片源={
“#版本130核心\n”
“out vec4 FragColor;\n”
“void main()\n”
“{\n”
FragColor=vec4(1.0f,0.0f,1.0f,1.0f);\n
“}\n”
"\0"
};
GLuint fragmentShader=glCreateShader(GL\u fragmentShader);
glShaderSource(fragmentShader,1和fragmentSource,NULL);
glCompileShader(fragmentShader);
program=glCreateProgram();
glAttachShader(程序,顶点着色器);
glAttachShader(程序、碎片着色器);
GLBindAttriblation(计划,0,“IPO”);
glLinkProgram(program);
}
void SetupBuffers()
{
glGenVertexArrays(1和VAO);
glGenBuffers(1,&VBO);
glGenBuffers(1和EBO);
浮点顶点数据[]={
0.0f,0.0f,0.0f,
10.0f,10.0f,0.0f,
10.0f,0.0f,0.0f,
0.0f,10.0f,0.0f
};
glBindVertexArray(VAO);
glBindBuffer(GL_数组_BUFFER,VBO);
glBufferData(GL_数组_缓冲区、sizeof(vertexData)、vertexData、GL_静态_绘图);
无符号整数索引数据[]={
0, 1, 2,
1, 2, 3
};
glBindBuffer(GLU元素数组缓冲区,EBO);
glBufferData(GL\u元素\u数组\u缓冲区、sizeof(indexData)、indexData、GL\u静态\u绘图);
glvertexattributepointer(0,3,GL_FLOAT,false,sizeof(FLOAT)*3,(void*)0);
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,0);
glBindBuffer(GL_元素_数组_缓冲区,0);
glBindVertexArray(0);
}
无效设置场景(HWND和U HWND)
{
静态PIXELFORMATDESCRIPTOR pfd=//pfd告诉Windows我们希望事情是怎样的
{
sizeof(PIXELFORMATDESCRIPTOR),//此像素格式描述符的大小
1,//版本号
PFD_DRAW_TO_WINDOW |//格式必须支持WINDOW
PFD_支持_OPENGL |//格式必须支持OPENGL
PFD_DOUBLEBUFFER,//必须支持双缓冲
PFD_TYPE_RGBA,//请求RGBA格式
32,//选择我们的颜色深度
0,0,0,0,0,0,//忽略颜色位
0,//没有Alpha缓冲区
0,//已忽略移位位
0,//无累积缓冲区
0,0,0,0,//忽略累加位
16,//16位Z缓冲区(深度缓冲区)
0,//没有模具缓冲区
0,//没有辅助缓冲区
PFD_主平面,//主绘图层
0,//保留
};
HDC HDC=GetDC(_hWnd);
int pf=选择像素格式(hdc和pfd);
SetPixelFormat(hdc、pf和pfd);
HGLRC HGLRC=wglCreateContext(hdc);
wglMakeCurrent(hdc、hglrc);
glewInit();
显示窗口(显示窗口、显示窗口);
SetForeGroundindow(_hWnd);
设置焦点(_hWnd);
SetupShaders();
设置缓冲区();
}
无效调整场景大小(HWND和HWND、大小和宽度、大小和高度)
{
如果(!\u高度)
{
_高度=1;
}
glViewport(0,0,_宽度,_高度);
绘画场景;
}
虚空绘制场景(HWND _HWND)
{
HDC HDC=GetDC(_hWnd);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glClearColor(0.0f、1.0f、0.0f、1.0f);
glUseProgram(程序);
glBindVertexArray(VAO);
glBindBuffer(GL_数组_BUFFER,VBO);
glBindBuffer(GLU元素数组缓冲区,EBO);
gld元素(GL_三角形,6,GL_无符号字节,0);
SwapBuffers(hdc);
}

您确实需要启用调试验证层并检查错误,因为您的代码中有一大堆容易发现的错误概念:

  • 不要使用
    glbindattiblocation
    iPos
    已(正确)绑定到布局位置0,您正在破坏它

  • 链接着色器程序后,没有分离和删除该程序,因此内存泄漏

  • 不要从顶点数组中解除顶点和元素缓冲区的绑定,这是使用它的首要目的

  • 与3相关,不要在每次渲染时更改顶点数组的顶点和元素缓冲区。您只需设置一次顶点缓冲区

  • 您告诉OpenGL您的索引元素是
    glDrawElements
    中的字节,而您将它们作为32位整数上传。保持一致


  • 非常感谢你帮助我!我一直在寻找daysMight的解决方案。我还建议学习使用Renderdoc(或类似工具),它有一个显示错误/警告的窗口,您将能够看到数据的解释是否正确。这将帮助您诊断像#5这样的问题。RenderDoc中的错误/警告只是调试层输出,您也可以(而且应该)在自己的代码中得到它。