【发布时间】:2014-01-19 07:16:35
【问题描述】:
OpenGL SuperBible 第 6 版(适用于 OpenGL 4.3)包含使用顶点着色器的示例,这些顶点着色器没有顶点属性输入,但顶点是硬编码的,例如
#version 420 core
void main(void)
{
const vec4 vertices[] = vec4[](vec4( 0.4, -0.4, 0.5, 1.0),
vec4(-0.4, -0.4, 0.5, 1.0),
vec4( 0.4, 0.4, 0.5, 1.0));
gl_Position = vertices[gl_VertexID];
}
当我运行示例时,窗口被清除,但没有其他任何反应。
通过实验,我发现在将空缓冲区绑定到上下文时,程序会按预期运行。下面是示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h> /
#include <GLFW/glfw3.h>
#define GLM_MESSAGES
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtx/vector_angle.hpp>
int main(int argc, char* argv[]) {
GLuint program;
GLuint vao;
GLuint vbo;
glfwInit();
GLFWwindow* window = glfwCreateWindow(640, 480, "gl_InstanceID", NULL, NULL);
glfwMakeContextCurrent(window);
glewInit();
program = glCreateProgram();
GLuint vs = load("vertex.glsl", GL_VERTEX_SHADER, true);
GLuint fs = load("frag.glsl", GL_FRAGMENT_SHADER, true);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glDeleteShader(vs);
glDeleteShader(fs);
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
//**************************************
//no triangle drawn when below these lines commented out
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 4, NULL, GL_DYNAMIC_COPY);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
//***************************************
do {
static const GLfloat green[] = { 0.0f, 0.2f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, green);
glUseProgram(program);
glDrawArrays(GL_TRIANGLES, 0, 3); //OR glDrawArraysInstanced(GL_TRIANGLES, 0, 3,1);
glfwSwapBuffers(window);
glfwPollEvents();
if (GLFW_PRESS == glfwGetKey(window, GLFW_KEY_ESCAPE)) {
glfwSetWindowShouldClose(window, 1);
}
} while (!glfwWindowShouldClose(window));
glfwTerminate();
return 0;
}
在星之间添加代码时,会绘制三角形。如果没有缓冲区,则不会绘制三角形。
另外,当顶点数组对象(VAO)被移除(或如上使用)时,三角形也不会显示。只有 VAO 和(空)VBO 才绘制三角形。
移除 VAO 但有缓冲区显示三角形。没有缓冲区没有三角形。 VAO似乎没有什么不同。
还要注意顶点着色器没有输入。
发生了什么?
- 编译器/显卡认为顶点着色器什么都不做并删除它?我感觉是显卡(驱动)。
- 这是 OpenGL 的预期还是因为显卡?
- 我对缓冲区、VAO 和着色器的理解有些欠缺?
其他可能有用的信息
- GLEW 1.10.0
- GLFW 3.0.3
片段着色器:
#version 420 core
out vec4 color;
void main(void)
{
color = vec4(1.0);
}
操作系统详情:
- Linux:3.2.0-4-amd64
- 发行版:Debian 7.3 Wheezy
- uname -m: x86_64
编译器细节
- g++ --version: g++ (Debian 4.7.2-5) 4.7.2
OpenGL 细节:
- OpenGL 提供程序:Advanced Micro Devices(来自 AMD Catalyst Control Center)
- OpenGL 渲染器:AMD Radeon HD 7600M 系列(来自 AMD Catalyst Control Center)
- OpenGL 版本:4.2.11762 兼容性配置文件上下文(来自 AMD Catalyst Control Center)
- glxinfo:
- 服务器 glx 版本字符串:1.4
- 客户端 glx 版本字符串:1.4
- GLX 版本:1.4
- OpenGL 版本字符串:4.2.11762 兼容性配置文件上下文
- OpenGL 着色语言版本字符串:4.20
- 服务器 glx 供应商字符串:ATI
- 客户端 glx 供应商字符串:ATI
在使用与 Linux 相同的显卡的 Windows 中也会出现此问题,即
- Windows 8
- 64 位
- 在 ATI Technologies Inc. 的 AMD Radeon HD 7670M 上运行
- 支持 OpenGL 版本 4.2.11762 兼容性配置文件上下文
AMD 有一个适用于 Linux 的新版本 13.12 驱动程序(我使用的是 13.4)。有时间我会尝试一下,因为上次安装并不容易。
我还登录了issue 984 on Unofficial AMD Bugzilla。但也许它已在 13.12 中修复。
但是,程序可以正常运行(无论是不使用空缓冲区还是使用空缓冲区),都在运行
- Windows 7 专业版
- 64 位
- NVIDIA GeForce GT 520M(驱动日期:2013/10/15,驱动版本:9.18.13.3158)
继续
- Windows 8
- 64 位
- 在英特尔的 Intel(R) HD Graphics 4000 上运行,
- OpenGL 版本 4.0.0 - 内部版本 9.17.10.2849
【问题讨论】:
-
:( 将#version 420 core 添加到片段着色器没有帮助。
标签: opengl