簡體   English   中英

QGLShaderProgram :: setAttributeArray(0,…)與QGLShaderProgram :: setAttributeArray(“ position”,…)

[英]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.

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