我是Dart,WebGL,GLSL的新手;但是我有一些简单的代码将一些精灵渲染到屏幕上。在尝试添加对渲染纹理部分的支持时(为了支持精灵表),我遇到了一些我无法弄清楚的奇怪行为(我不认为这是一个错误,我认为我是误解;但我可以弄清楚!)。
我设法将代码剥离成非常简单的东西,我可以在它之间切换工作与否;在我的着色器中使用以下行:
vTextureCoord = aTextureCoord * aTextureRect.xy / aTextureFullSize; // WORKS FINE
vTextureCoord = aTextureCoord * aTextureRect.zw / aTextureFullSize; // RENDERS BLANK SQUARE
请注意,这些行之间的唯一区别是使用.xy
vs .zw
。
aTextureRect
属性声明如下:
attribute vec4 aTextureRect;
我这样设置:
aTextureRect = _gl.getAttribLocation(program, "aTextureRect");
_gl.vertexAttrib2fv(shader.aTextureRect, new Float32List.fromList([128.0, 128.0, 128.0, 128.0]));
请注意,我将所有4个浮点数设置为相同的值。
似乎只设置了我vec4
的前两部分(x
和y
);其他两个都不是128(我通过将它们分别代替y
来证实这一点,并且没有任何渲染。)
这是我在着色器中使用的第一个vec4
;所有其他属性都是vec2
,所以我认为它的工作方式有所不同;但我正在努力弄清楚是什么!
答案 0 :(得分:1)
哦,伙计,我已经盯着屏幕太久了!
_gl.vertexAttrib2fv(shader.aTextureRect, new Float32List.fromList([128.0, 128.0, 128.0, 128.0]));
^
应该
_gl.vertexAttrib4fv(shader.aTextureRect, new Float32List.fromList([128.0, 128.0, 128.0, 128.0]));
^
至少WebGL崩溃并告诉我,我传递的数据超出预期,是吗? < /讽刺>