簡體   English   中英

OpenGL是否消除沒有綁定頂點緩沖區的頂點着色器?

[英]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似乎沒有任何作用。

還要注意,頂點着色器沒有輸入。

發生什么事了?

  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
  • ame -m:x86_64

編譯器詳細信息

  • g ++ --version:g ++(Debian 4.7.2-5)4.7.2

OpenGL詳細信息:

  • OpenGL Provider: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)。 如果有一段時間,我會嘗試一下,因為上次安裝並不容易。

我還在非官方的AMD Bugzilla上記錄了問題984 但也許它已在13.12中修復。


但是,該程序可以運行(在不使用空緩沖區且沒有空緩沖區的情況下)

  • Windows 7專業版
  • 64位
  • NVIDIA GeForce GT 520M(驅動程序日期:2013/10/15,驅動程序版本:9.18.13.3158)

繼續

  • Windows 8
  • 64位
  • 在Intel的Intel®HD Graphics 4000上運行,
  • OpenGL版本4.0.0-內部版本9.17.10.2849

不,不管您相信與否, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM