簡體   English   中英

多維數據集貼圖渲染紋理創建在GL 3.2中有效,但在4.3中出現錯誤

[英]Cube map render texture creation works in GL 3.2 but gives an error in 4.3

我正在使用以下代碼創建多維數據集貼圖渲染目標:

glGenTextures( 1, &id );
glBindTexture( GL_TEXTURE_CUBE_MAP, id );

glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE );

// Creates a renderbuffer object to store depth info.
GLuint bufferId;
glGenRenderbuffers( 1, &bufferId );

glBindRenderbuffer( GL_RENDERBUFFER, bufferId );
glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height );
glBindRenderbuffer( GL_RENDERBUFFER, 0 );

glGenFramebuffers( 1, &fboId );
glBindFramebuffer( GL_FRAMEBUFFER, fboId );

const GLenum externalFormat = GL_RGBA;
const GLenum internalFormat = GL_RGBA8;
const GLenum dataType = GL_UNSIGNED_BYTE;

for (int i = 0; i < 6; ++i)
{
    glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalFormat,
                 size, size, 0, externalFormat,
                 dataType, nullptr );
    glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, id, 0 );
}

glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bufferId );

它不會在OpenGL 3.2上下文中生成任何OpenGL錯誤,但是在OpenGL 4.3上下文中運行相同的代碼時,調試輸出回調在glFramebufferTexture2D上會產生以下錯誤:

OpenGL: Framebuffer unsupported. Attachment COLOR_ATTACHMENT0 unsupported because it uses an inconsistent texture due to invalid texture parameters.

我正在使用NVIDIA GeForce GT 750M,驅動程序337.88在Windows 8.1上運行代碼。 我是否錯誤地創建了渲染目標?

我不確定這是什么錯誤,但可能與sizewidthheight之間的不匹配有關。

無論如何,還有其他一些問題:

  1. 每個循環迭代僅覆蓋GL_COLOR_ATTACHMENT0 也許更改為GL_COLOR_ATTACHMENT0 + i

  2. 但是,這意味着,只要片段通過深度測試,就必須寫入多維數據集的每一層。

  3. 您還只有一個渲染緩沖區,只有一個圖層,這意味着對多維數據集的所有面都使用了一個深度測試。

我認為以上並不是您想要的。

  • 要渲染為立方體紋理,您可以依次綁定每個圖層,從一個新的投影中多次渲染整個場景。 這是老方法。

  • 要僅通過一次渲染就可以渲染為立方體紋理,可以將整個立方體貼圖(實際上只是常規紋理的6層)綁定到GL_COLOR_ATTACHMENT0 對於深度測試,您可以使用GL_DEPTH_COMPONENT創建另一個立方體紋理 (或渲染緩沖區,但不確定是否可以綁定)並將其綁定到GL_DEPTH_ATTACHMENT 然后,在幾何體着色器中,您將所有內容重復6次,對於立方體的每個面一次。 幾何着色器中的gl_Layer用於設置基本體將繪制到立方體中的哪個面。 想一想,您還可以使用實例化( glDrawElementsInstanced / gl_InstanceID )將幾何圖形復制6次,這將使計算從幾何圖形着色器轉移到頂點着色器,並且如果您的頂點操作很昂貴,可能會更快一些。

在這兩種情況下,您都將需要一個長寬比為1的90度投影矩陣,並且需要旋轉視圖以匹配多維數據集的面(這很奇怪,因此請保存您的代碼以備將來使用)。 因此,根據您是否使用實例化,創建6個視圖矩陣,並將它們傳遞給幾何或頂點着色器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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