c++ - OpenGL 和 GLFW - 我需要着色器来绘制点吗?

标签 c++ opengl shader glfw

我正在处理 book on OpenGL ,我卡在了第三章。以下代码应打开一个窗口并在中心绘制一个点。

窗口出现,glClearColorglClear 似乎可以正常工作,但没有点。 This answer让我相信我可能需要编译和链接简单的顶点和片段着色器。

这本书没有提到它们,但我需要着色器吗?我是不是在画点时遗漏了其他东西? window 有什么东西?这本书使用了一些 WIN32 东西作为窗口,我使用的是 Linux Mint 17.1

代码如下:

#include <stdlib.h>
#include <stdio.h>

#include <GL/glew.h>
#include <GL/gl.h>
#include <GLFW/glfw3.h>
#include <GL/glut.h>

#define BUFFER_OFFSET(i) ( (char*)NULL + (i) )

static void error_callback(int error, const char* description) {
  fputs(description, stderr);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
  if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
    glfwSetWindowShouldClose(window, GL_TRUE);
}

int main(void) {
  GLFWwindow* window;
  glfwSetErrorCallback(error_callback);
  if (!glfwInit()) {
    exit(EXIT_FAILURE);
  }

  window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
  if (!window) {
    glfwTerminate();
    exit(EXIT_FAILURE);
  }
  glfwMakeContextCurrent(window);
  glfwSwapInterval(1);
  glfwSetKeyCallback(window, key_callback);

  if (glewInit()) {
    glfwTerminate();
    exit(EXIT_FAILURE);
  }

  glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

  float ratio;
  int width, height;
  glfwGetFramebufferSize(window, &width, &height);
  ratio = width / (float) height;
  glViewport(0, 0, width, height);

  GLfloat vertex [] = {0.0f, 0.0f, -2.0f};
  GLuint m_vertexBuffer;
  glGenBuffers(1, &m_vertexBuffer);
  glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
  glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3, &vertex[0], GL_STATIC_DRAW);

  while (!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
    glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
    glPointSize(10.0f);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_POINTS, 0, 1);
    glDisableClientState(GL_VERTEX_ARRAY);

    glfwSwapBuffers(window);
    glfwPollEvents();
  }

  glfwDestroyWindow(window);
  glfwTerminate();
  exit(EXIT_SUCCESS);
}

此外,我正在使用 g++ main.cpp -lGL -lglfw -lGLU -lGLEW

进行编译

我已经安装了 OpenGL 4.5,但正在打开固定管道上下文。

最佳答案

来自您的代码:

GLfloat vertex [] = {0.0f, 0.0f, -2.0f};

由于您使用固定函数 pipelione 并且从不设置任何矩阵,因此投影和 modelView 矩阵都将保留为默认值,并且点 (0, 0, -2) 位于查看体积之外。请尝试使用 (0, 0, 0)。

如果这本书恰好使用了这个顶点坐标的代码,你最好搜索另一个。您还应该考虑学习“现代” GL。固定功能管线基本上已被 GL2.0 中的着色器取代十年前

关于c++ - OpenGL 和 GLFW - 我需要着色器来绘制点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36903506/

相关文章:

c++ - 缺少迭代器失效是否意味着推进迭代器的有效性?

opengl - mipmap 对比例变换有反应吗?

unity-game-engine - Unity3D 部分网格在某些角度下变得不可见

c++ - Windows命令提示符中的彩色文本一行

c++ - 为什么 C 编译器不在 for 循环体内给出重新声明错误?

c++ - 使用非平凡的构造函数初始化 union

opengl - 是否可以在 uint32 格式纹理上累积片段编号?

c++ - 使用不同纹理对多个对象进行纹理化

shader - 我想像在 Photoshop 中一样创建内部阴影着色器

xna - 是否可以从着色器代码*检索*整数数据?