[英]Is it possible to send uniform data to a struct in GLSL with one function call
[英]In GLSL (330 or otherwise) what could cause a uniform struct to behave differently than a variable struct?
我在OpenGL 3.3中遇到一個奇怪的問題。 我用vec4
成員“ u”和“ v”定義了一個名為Dual
的結構,並開始編寫和測試函數,例如稍后將在我的代碼片段中看到的“三明治產品”(我包括實現,但應該無關緊要。 )在此測試中,我使用了兩套單獨的vec4
制服,稱它們為“ u”和“ v”,以明確它們的未來用途,並簡單地從中快速制作出Duals。 當我對這種行為感到滿意時,我制作了一個統一的Dual,稱為“模型”(如在model-view-projection中一樣),並開始將對獨立向量的引用交換為對模型成員的引用。 我出現黑屏,但沒有錯誤。
我已經對頂點着色器進行了重新設計,直到僅通過切換兩行注釋就可以啟用/禁用該問題:
#version 330
struct Dual { vec4 u, v; };
// (...)
// This should be agnostic to where the args come from
// It was and is correct given local variables/values
Dual sandwich(Dual u, Dual v) { return mul(mul(u, v), conj(u)); }
uniform mat4 projection;
const vec4 u0 = vec4(1,0,0,0), v0 = vec4(0,0,0,0);
uniform vec4 u = u0, v = v0;
uniform Dual model = Dual(u0, v0);
in vec4 pos_in;
out vec4 pos_out;
void main(){
// Swizzling 'xyz' and then 'yzw' adapts GLSL 'xyzw' to/from 'wxyz'
// It may look strange, but again, it works for local values
Dual x = Dual(u0, vec4(0, pos_in.xyz)),
// mxm = sandwich(model, x); // -> big black canvas
mxm = sandwich(Dual(u, v), x); // -> big rainbow square
gl_Position = projection * vec4(mxm.v.yzw, 1);
pos_out = gl_Position;
}
在我的C ++代碼中,我嘗試在初始化后設置一次值,每次按一次鍵到不同的預設,甚至每幀一次,但是現在我依靠着色器中的默認初始化,直到按下鍵為止-這是看起來像什么:
auto mu = program.locate("model.u"), mv = program.locate("model.v"),
u = program.locate("u"), v = program.locate("v");
// ...key 1 is pressed, so set both pairs to the Dual identity...
glUniform4f(mu, 1, 0, 0, 0); glUniform4f(mv, 0, 0, 0, 0);
glUniform4f(u, 1, 0, 0, 0); glUniform4f(v, 0, 0, 0, 0);
// ...key 2 is pressed, set both to something else, and so on
當然,我的第一個猜測是我在錯誤地定位成員,但這是我在其他地方看到的語法,而且我也沒有看到錯字。 由於沒有名稱未知的關聯錯誤,因此我檢查了model.u
-1的位置,但是model.u
和model.v
分別報告0和1。
使用常量“ u0”和“ v0”來初始化vec4
和模型的成員,但是作為某種健全性檢查,我嘗試通過值對其進行初始化。 該行為是完全一樣的,因為它應該是-為什么會使用值產生不同的結果比初始化為該值的變量? 即使我扮演魔鬼的擁護者並假定存在一些差異,但是當將它們初始化為命名變量“ u0”和“ v0”而不是獨立變量“ u”和“ v”時,為什么相同的問題不會對獨立的“ u”和“ v”產生影響他們被賦予的價值?
感謝您的時間。 我覺得,如果我只是接受這種行為並繼續前進,那我就是沒有通過健全性檢查的人。
const vec4 u0 = vec4(1,0,0,0), v0 = vec4(0,0,0,0);
uniform vec4 u = u0, v = v0;
uniform Dual model = Dual(u0, v0);
這三行初始化u0, v0, u, v, model
。 這些具有提供的值的初始化是在鏈接時完成的。
我在GLSL規范中找不到有關全局變量順序的信息。 我找到的最接近的是4.2范圍 :
在聲明內,名稱的范圍(如果存在)立即在初始化程序之后開始,如果不存在,則立即在聲明之后開始。
但是“范圍”與“順序或初始化”不同。
因此,可能是在u0, v0
之前對model
進行了初始化,因此這些值未定義。
安全的方法(不依賴於不同的供應商實現)不依賴於其他全局變量,而是使用:
uniform Dual model = Dual(vec4(1,0,0,0), vec4(0,0,0,0));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.