gpt4 book ai didi

opengl - OpenGL 是否消除了没有绑定(bind)顶点缓冲区的顶点着色器?

转载 作者:行者123 更新时间:2023-12-05 05:27:16 24 4
gpt4 key购买 nike

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];
}

当我运行示例时,窗口被清除但没有其他任何事情发生。

通过实验,我发现当将空缓冲区绑定(bind)到上下文时,程序会按预期运行。下面是示例程序:

#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 似乎没有什么不同。

另请注意顶点着色器没有输入。

这是怎么回事?

  1. 编译器/显卡认为顶点着色器什么都不做并删除它?我感觉是显卡(驱动程序)。
  2. 这是 OpenGL 的预期还是因为显卡?
  3. 我对缓冲区、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 有一个新版本 13.12 的 Linux 驱动程序(我使用的是 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 的 Intel(R) HD Graphics 4000 上运行,
  • OpenGL 版本 4.0.0 - 内部版本 9.17.10.2849

最佳答案

不信不信 glDrawArrays (...) 与绑定(bind)哪个顶点缓冲区无关。顶点缓冲区绑定(bind)仅在您设置顶点指针时才重要,因为它定义了您传递的指针相对于的地址空间。从那时起,绑定(bind)的 VBO 就无关紧要了。 顺便说一句,如果您在严格的 GLSL 实现上运行此片段着色器,它将警告/拒绝工作,因为没有 #version 指令,它应该假定片段着色器是针对 GLSL 1.10 规范编写的,它不支持 out 阶段变量(您需要 gl_FragData [0])。

或者,简单地添加 #version 420 core 就像您在顶点着色器中所做的那样...version 指令实际上比您想象的更重要,特别是因为在没有它的情况下发生的行为供应商之间差异很大。这样做可能无法解决您的问题,但这仍然是您应该解决的问题。

至于删除 VAO 的问题,这是可以预料的。在核心 OpenGL 3.2+ 上下文中,您必须具有非零 VAO 绑定(bind)才能使 glDrawArrays (...) 正常工作。实际上,VAO 成为顶点绘制命令的上下文。没有一个边界,你就没有他们可以操作的上下文。

关于opengl - OpenGL 是否消除了没有绑定(bind)顶点缓冲区的顶点着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com