[英]Does OpenGL eliminate a vertex shader with no bound vertex buffer?
OpenGL SuperBible 6th Ed(對於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似乎沒有任何作用。
還要注意,頂點着色器沒有輸入。
發生什么事了?
其他可能有用的信息
片段着色器:
#version 420 core
out vec4 color;
void main(void)
{
color = vec4(1.0);
}
操作系統詳細信息:
編譯器詳細信息
OpenGL詳細信息:
在使用與Linux中相同的圖形卡的Windows中,也會發生此問題,即
AMD的Linux驅動程序具有新版本13.12(我正在使用13.4)。 如果有一段時間,我會嘗試一下,因為上次安裝並不容易。
我還在非官方的AMD Bugzilla上記錄了問題984 。 但也許它已在13.12中修復。
但是,該程序可以運行(在不使用空緩沖區且沒有空緩沖區的情況下)
繼續
不,不管您相信與否, glDrawArrays (...)
與綁定頂點緩沖區無關。 頂點緩沖區綁定僅在您設置頂點指針時才重要,因為它定義了您傳遞的指針所相對的地址空間。 從這一點來看,綁定的VBO無關緊要。 順便說一句,如果你運行在嚴格執行GLSL它會警告這個片段着色器/拒絕沒有因為工作#version
它應該承擔的片段着色器對GLSL 1.10規范的書面指令,不支持out
階段變量(您需要gl_FragData [0]
代替)。
或像在頂點着色器中那樣簡單地添加#version 420 core
...版本指令實際上比您想象的要重要,尤其是因為在缺少它的情況下,不同廠商之間的行為存在很大差異。 這樣做可能無法解決您的問題,但仍然是您應該解決的問題。
至於刪除VAO的問題,這是可以預料的。 在核心OpenGL 3.2+上下文中,必須具有非零VAO綁定才能使glDrawArrays (...)
正常工作。 實際上,VAO成為頂點繪制命令的上下文。 沒有界限,您就沒有上下文可操作。
請記住,頂點着色器只能操縱現有的頂點。 它無法創建它們。 即使在着色器中對該位置進行了硬編碼,您仍然必須將其進行某種轉換。
否,這似乎是AMD Radeon HD 7600M系列(13.4)驅動程序中的錯誤
我安裝了最新的AMD驅動程序 ,它在Windows和Linux中均解決了該問題。
Linux:安裝了amd-catalyst-13.12-linux-x86.x86_64.zip
Windows:安裝了amd_catalyst_13.11_mobility_betav9.5.exe
要在Linux上重新安裝AMD驅動程序,我先卸載AMD安裝(amd-catalyst-previous-version.run --uninstall),刪除所有包含名稱fglrx的軟件包(使用aptitude),將符號鏈接調整為/ usr / lib64(請參見下文),然后運行新的amd-catalyst-13.12-linux-x86.x86_64.run。
我碰到了此頁面AMD 13.1 64位驅動程序和libGL.so.1錯誤 , 該錯誤說明了AMD安裝程序將libGL.so文件放在何處
安裝程序會將lib文件放在/ usr / lib64中。 但是,如果有Ubuntu,則64位庫位於/ usr / lib中。 我做了以下事情來解決我的問題。
卸載驅動程序sudo ./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run --uninstall
刪除/ usr / lib64文件夾sudo rm -Rf / usr / lib64
創建一個指向/ lib / usr的符號鏈接/ usr / lib64 sudo ln -s / usr / lib / usr / lib64
再次安裝驅動程序sudo ./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run --force
重新啟動sudo重新啟動
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.