簡體   English   中英

在GLSL(330或其他版本)中,是什么導致統一結構的行為與可變結構不同?

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

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