[英]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上運行代碼。 我是否錯誤地創建了渲染目標?
我不確定這是什么錯誤,但可能與size
, width
和height
之間的不匹配有關。
無論如何,還有其他一些問題:
每個循環迭代僅覆蓋GL_COLOR_ATTACHMENT0
。 也許更改為GL_COLOR_ATTACHMENT0 + i
。
但是,這意味着,只要片段通過深度測試,就必須寫入多維數據集的每一層。
您還只有一個渲染緩沖區,只有一個圖層,這意味着對多維數據集的所有面都使用了一個深度測試。
我認為以上並不是您想要的。
要渲染為立方體紋理,您可以依次綁定每個圖層,從一個新的投影中多次渲染整個場景。 這是老方法。
要僅通過一次渲染就可以渲染為立方體紋理,可以將整個立方體貼圖(實際上只是常規紋理的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.