我无法让我的 OpenGL 程序渲染三角形
I can't get my OpenGL program to render a triangle
所以我在OpenGL中编写了一个模型加载器,它确实加载了模型,但由于某种原因,我在屏幕上看不到生成的三角形。自己看看:
#define GLEW_STATIC
#include <GLglew.h> // Graphics Libraries
#include <GLFWglfw3.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
int main()
{
std::cout << "Please enter the name of the mesh file: ";
std::string FileName;
std::cin >> FileName;
std::cout << "You entered: " << FileName << std::endl;
if (!glfwInit())
{
std::cout << "Failed to initialize GLFW" << std::endl;
system("Pause");
return EXIT_FAILURE;
}
std::cout << "GLFW 3.0.4 Initialized" << std::endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWwindow* Window = glfwCreateWindow(800, 600, "Window", NULL, NULL);
glfwMakeContextCurrent(Window);
if (Window == NULL)
{
std::cout << "Failed to create an OpenGL 3.3 context" << std::endl;
system("Pause");
return EXIT_FAILURE;
}
std::cout << "Created an OpenGL 3.3 context" << std::endl;
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cout << "Failed to initialize GLEW 1.11.0" << std::endl;
system("Pause");
return EXIT_FAILURE;
}
std::ifstream FileStream(FileName);
std::vector <float> Vertices;
if (!FileStream)
{
std::cout << "An error was encountered while opening "<< FileName << std::endl;
system("Pause");
return EXIT_FAILURE;
}
float coordinateX, coordinateY, coordinateZ;
std::string Character;
while (!FileStream.eof())
{
FileStream >> Character;
if (Character == "v")
{
FileStream >> coordinateX >> coordinateY >> coordinateZ;
std::cout << "Loading in " << coordinateX << " " << coordinateY << " " << coordinateZ << std::endl;
Vertices.push_back(coordinateX);
Vertices.push_back(coordinateY);
Vertices.push_back(coordinateZ);
}
else
{
std::cout << "Skipping " << Character << std::endl;
continue;
}
}
std::cout << "Loaded " << FileName << std::endl;
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * Vertices.size(), &Vertices.front(), GL_STATIC_DRAW);
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
const char* Vertex_Shader =
"#version 330n"
"in vec3 vp;"
"void main () {"
" gl_Position = vec4 (vp, 1.0);"
"}";
const char* Fragment_Shader =
"#version 330n"
"out vec4 frag_colour;"
"void main () {"
" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"
"}";
unsigned int VertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VertexShader, 1, &Vertex_Shader, NULL);
glCompileShader(VertexShader);
unsigned int FragmentShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(FragmentShader, 1, &Fragment_Shader, NULL);
glCompileShader(FragmentShader);
unsigned int Shader_Program = glCreateProgram();
glAttachShader(Shader_Program, FragmentShader);
glAttachShader(Shader_Program, VertexShader);
glLinkProgram(Shader_Program);
while (!glfwWindowShouldClose(Window))
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(Shader_Program);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, Vertices.size());
glfwPollEvents();
glfwSwapBuffers(Window);
}
return EXIT_SUCCESS;
}
加载的文件如下:
v 0.0 0.5 0.0
v 0.5 -0.5 0.0
v -0.5 -0.5 0.0
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
const char* Vertex_Shader =
"#version 330n"
"in vec3 vp;"
"void main () {"
" gl_Position = vec4 (vp, 1.0);"
"}";
无法保证将按声明顺序为属性分配属性槽。
你需要告诉OpenGL(通过location
限定符或glBindAttribLocation()
前链接(把它放在哪里或问(glGetAttribLocation()
后链接(它被放在哪里。
此代码中至少有 3 个问题:
-
它创建两个顶点着色器对象,并且没有片段着色器对象。取代:
unsigned int FragmentShader = glCreateShader(GL_VERTEX_SHADER);
由:
unsigned int FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-
要
glDrawArrays()
的第三个参数必须是顶点数,而此代码传入坐标总数。由于此处使用每个顶点 3 个坐标,因此将调用更改为:glDrawArrays(GL_TRIANGLES, 0, Vertices.size() / 3);
-
未指定顶点属性的位置。这可能是"偶然"起作用的,特别是只要只有一个属性。但是指定位置要安全得多。执行此操作的最简单方法是将位置添加到
vp
顶点着色器的声明中:"layout(location = 0) in vec3 vp;"
- 你把你的
GL_ARRAY_BUFFER
绑错
了 - 着色器创建中存在错误
- 您的着色器错误
1(只需在glBindVertexArray
调用后绑定(并创建(您的GL_ARRAY_BUFFER
即可。
2(正如在另一个答案中已经说过的,你的片段着色器创建是错误的,应该读作:unsigned int FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
3(你理所当然地认为你会在你的着色器中获得正确的属性,这是不好的做法。您应该明确并具有类似于以下内容的布局:layout(location = X) in vec3 myVec;
还有几点提示:
无需在循环中重新绑定您的 VAO,只需在while(!glfwWindowShouldClose(Window))
之前绑定它即可。着色器程序也是如此。
你应该检查你的着色器是否正确编译,你的程序是否正确链接!看看glGetShaderiv
,glGetProgramiv
分别用GL_COMPILE_STATUS
和GL_LINK_STATUS
;如果你没有得到任何一种状态的GL_TRUE
,glGetShaderInfoLog
和glGetProgramInfoLog
。
这将为您提供一条消息,告诉您在编译/链接时遇到的确切问题,以便您可以轻松地调试着色器代码而无需猜测。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- OpenGL程序不显示三角形
- GLFW程序不绘制三角形
- 创建一个程序以输出三角形平方数的4个
- 我的程序C++找到三角形的类型,我的if-else语句遇到问题
- 我如何使用关系 btwn 3 整数来确定三角形和/或我可以使用什么声明来使这个程序工作
- 帕斯卡三角形程序 C++ 上的间距
- 程序(三角形旋转)异常终止
- 为什么我在计算帕斯卡三角形元素时在递归 C 程序中出现堆栈溢出错误
- C++程序在试图显示一个顶点从数据文件中读取的三角形时会冻结
- 我无法让我的 OpenGL 程序渲染三角形
- 用c++编写程序,生成一个带有星星的三角形,但结果总是差两个数字
- 为什么这个找到具有 >500 个因子的最小三角形数的程序会崩溃?
- 代码生成 - C++确定三角形的程序
- 为什么这个帕斯卡三角形程序不起作用?