初学者 openGL 项目渲染三角形的问题
Posted
技术标签:
【中文标题】初学者 openGL 项目渲染三角形的问题【英文标题】:Issues with beginner openGL project rendering triangles 【发布时间】:2019-03-02 02:17:23 【问题描述】:我正在尝试创建 8 个三角形,并让这些三角形围绕 z 轴旋转。由于某种原因,没有一个三角形出现,我不太确定为什么。我的代码编译并运行,所以我真的不知道如何调试它。任何帮助将不胜感激
主要代码:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "shader_s.h"
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main()
// glfw: initialize and configure
// ------------------------------
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif
// glfw window creation
// --------------------
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
if (window == NULL)
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// glad: load all OpenGL function pointers
// ---------------------------------------
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
// build and compile our shader zprogram
// ------------------------------------
Shader ourShader("pinwheel.vs", "pinwheel.fs");
// set up vertex data (and buffer(s)) and configure vertex attributes
// ------------------------------------------------------------------
float vertices[] =
// positions // color coords
0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.25f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f,
1.0f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-1.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f,
-1.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.25f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-1.0f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
-0.5f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-0.25f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-0.5f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
1.0f, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f,
1.0f, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f,
0.5f, -0.25f, 0.0f, 1.0f, 1.0f, 0.0f,
0.5f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f
;
unsigned int VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//color attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
ourShader.use();
// render loop
// -----------
while (!glfwWindowShouldClose(window))
// input
// -----
processInput(window);
// render
// ------
glClearColor(0.8f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// create transformations
glm::mat4 transform = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix first
transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
// get matrix's uniform location and set matrix
ourShader.use();
unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));
// render container
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES,0, 24);
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
// -------------------------------------------------------------------------------
glfwSwapBuffers(window);
glfwPollEvents();
// optional: de-allocate all resources once they've outlived their purpose:
// ------------------------------------------------------------------------
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
// glfw: terminate, clearing all previously allocated GLFW resources.
// ------------------------------------------------------------------
glfwTerminate();
return 0;
// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
// make sure the viewport matches the new window dimensions; note that width and
// height will be significantly larger than specified on retina displays.
glViewport(0, 0, width, height);
这是我的顶点和片段着色器:
VS:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 color;
out vec4 vertexColor;
uniform mat4 transform;
void main()
gl_Position = transform*vec4(aPos, 1.0f);
vertexColor = vec4(color, 1.0);
FS:
#version 330 core
out vec4 FragColor;
in vec4 vertexColor;
void main()
FragColor = vertexColor;
【问题讨论】:
【参考方案1】:这个电话:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
... 覆盖先前的调用并将属性0
(位置属性)绑定到您的颜色数据。使第一个参数1
具有正确的绑定。
【讨论】:
工作。谢谢 不客气。我注意到您尚未接受对您的问题的任何回答。请点击旁边的复选标记接受解决了您的问题的答案。以上是关于初学者 openGL 项目渲染三角形的问题的主要内容,如果未能解决你的问题,请参考以下文章