任何人都可以告訴我GL_INT_2_10_10_10_REV作爲glVertexAttribPointer()中的類型參數的確切時間嗎? 我想通過使用這種類型的顏色值。這種類型的「REV」後綴的含義是什麼?它是否需要在着色器中進行特殊處理?在glVertexAttribPointer()中使用GL_INT_2_10_10_10_REV()
我的代碼如下:
GLuint red=1023,green=1023,blue=1023,alpha=3;
GLuint val = 0;
val = val | (alpha << 30);
val = val | (blue << 20);
val = val | (green << 10);
val = val | (red << 0);
GLuint test_data[]={val,val,val,val};
loadshaders();
glBindAttribLocation(ps,0,"tk_position");
glBindAttribLocation(ps,1,"color");
LinkShader();
glUseProgram(ps);
glEnableVertexAttribArray (0);
glVertexAttribPointer(0, 4, GL_FLOAT, 0, 0, vertices);
glEnableVertexAttribArray (1);
glVertexAttribPointer(1,GL_BGRA,GL_UNSIGNED_INT_2_10_10_10_REV,GL_TRUE,0,test_data);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
的着色器: 頂點着色器 -
#version 150
in vec4 tk_position;
in vec4 color;
out vec4 v_color;
void main()
{
v_color = color;
gl_Position = tk_position;
}
片段着色器 -
#version 150
in vec4 v_color;
out vec4 fragColor;
void main()
{
fragColor = v_color;
}
該程序對象被確認爲良好。那裏沒有問題。此代碼在AMD卡上正常工作,但在NVidia上失敗。失敗意味着我在glDrawArrays()調用中獲得NULL指針訪問權限。
Access violation
Exception Flag: 0x00000000
Exception Addr: 0x055f32ce
這很有用,謝謝。第二部分仍未得到答覆。如果我使用這種類型讓我們說指定顏色值,我該如何編碼?以下似乎不起作用:GLint data [] = {32767,32767,32767,32767}; glVertexAttribPointer(1,GL_BGRA,GL_INT_2_10_10_10_REV,GL_TRUE,0,數據);你還可以詳細說明「頂點正常包裝」究竟是什麼? – maverick9888
我發佈的表顯示哪些位對應着色器中的哪些值。根據[glVertexAttribPointer的手冊頁](http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml),您將得到一個「GL_INVALID_OPERATION」來將大小設置爲1而不是4。 –
頂點法線填充是指當您獲取頂點的法向量(通常是3d向量或12個字節)並將其壓縮到單個字節時。你會失去一點準確性,但有了法線,這不是一個明顯的區別,但它會顯着減小每個頂點的大小。 –