[英]QGLShaderProgram::setAttributeArray(0, …) VERSUS QGLShaderProgram::setAttributeArray(“position”, …)
我有一個頂點着色器:
#version 430
in vec4 position;
void main(void)
{
//gl_Position = position; => works in ALL cases
gl_Position = vec4(0,0,0,1);
}
如果我做:
m_program.setAttributeArray(0, m_vertices.constData());
m_program.enableAttributeArray(0);
一切正常。 但是,如果我這樣做:
m_program.setAttributeArray("position", m_vertices.constData());
m_program.enableAttributeArray("position");
注意: m_program.attributeLocation("position");
返回-1。
然后,我得到一個空的窗口。
Qt幫助頁面指出:
QGLShaderProgram :: setAttributeArray(int location,const QVector3D * values,int stride = 0)無效
在此着色器程序中位於位置的屬性上設置3D頂點值的數組。 步幅指示頂點之間的字節數。 默認跨步值為零表示頂點密集地堆積在值中。
在該位置調用enableAttributeArray()時,該陣列將變為活動狀態。 否則,將使用通過setAttributeValue()指定的位置值。
和
QGLShaderProgram :: setAttributeArray(const char *名稱,const QVector3D *值,int stride = 0)
這是一個過載功能。
在此着色器程序中,在名為name的屬性上設置3D頂點值的數組。 步幅指示頂點之間的字節數。 默認跨步值為零表示頂點密集地堆積在值中。
在名稱上調用enableAttributeArray()時,該陣列將變為活動狀態。 否則,將使用通過setAttributeValue()為name指定的值。
那么,為什么在使用“ int
版本”而不是“ const char *
版本”時有效?
它返回-1,因為您注釋掉了着色器中唯一實際使用position
。
這不是錯誤,是由於誤解了屬性位置分配的結果。 僅在編譯和鏈接所有着色器階段之后,才為均勻性和屬性分配位置。 如果活動代碼路徑中未使用制服或屬性,則不會為其分配位置。 即使使用變量執行以下操作:
#version 130
in vec4 dead_pos; // Location: N/A
in vec4 live_pos; // Location: Probably 0
void main (void)
{
vec4 not_used = dead_pos; // Not used for vertex shader output, so this is dead.
gl_Position = live_pos;
}
實際上,它比這更進一步。 如果從頂點着色器輸出了某些內容,但未在幾何圖形,曲面細分或片段着色器中使用某些內容,則其代碼路徑被視為無效。
順便說一下,頂點屬性位置0是隱式頂點位置。 這是GLSL規范中唯一的頂點屬性。 允許別名為固定功能的指針函數(例如glVertexPointer (...)
== glVertexAttribPointer (0, ...)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.