2011-09-26 48 views
0

我正在使用着色器,我正在观察一些非常奇怪的行为。我已经加载这个顶点着色器:奇怪的着色器腐败

所有我渲染 glDrawArrays(GL_POINTS,0,1000)与此着色器没有什么特别的
#version 150 

uniform float r; 
uniform float g; 
uniform float b; 
varying float retVal; 
attribute float dummyAttrib; 

void main(){ 
    retVal = dummyAttrib+r+g+b; //deleting dummyAttrib = corruption 
    gl_Position = gl_ModelViewProjectionMatrix*vec4(100,100,0,1); 
} 

首先,只使用着色器程序。如果你运行这个着色器并将点大小设置为可见的,你应该在屏幕中间看到白色方块(我正在使用glOrtho2d(0,200,0,200))。 DummyAttrib只是一些属性 - 如果没有,我的着色器将不会运行。此外,我需要实际使用该属性,所以通常我会做类似float c = dummyAttrib。这也是我想问的第一个问题,为什么这样。

但是这将是很好,但是当你改变与评论(retval=...)到retVal = r+g+b;行并添加提及线使用ATTRIB(float c = dummyAttrib),奇怪的事情发生。首先你不会再看到那个方块,所以我必须设置变换反馈来观察发生了什么。

我已将dummyAttrib设置为5的每个字段的元素和r = g = b = 1。使用当前的代码,变换反馈的结果是8 - 正是你所期望的。然而,像上面那样改变它会给出奇怪的值,例如250.128,并且每次我以某种方式修改代码(只是重新排序调用),该值都会改变。只要我将dummyAttrib归还到retVal的计算中,一切都会神奇地修复。

这就是为什么我认为有某种着色器腐败。我使用与之前在项目中使用的相同的着色器加载界面,这些都是完美无瑕的,但是它们以正常方式使用属性,而不仅仅是用于实际运行着色器的模型。

这两个问题可能有connecion。总结 - 如果该属性不用于设置在片段着色器或变换反馈中使用的变化,则着色器不会运行而没有任何属性,并且着色器已损坏。 PS:我在写这篇文章时想到,看起来每个变量都不用于进入下一个阶段,而是选择退出。这可以选择退出属性,然后该着色器将没有属性,并且不能正常工作。这可能是驾驶员故障吗?我有目前催化剂版本2010.1105.19.41785的Radeon 3870HD。

回答

1

如果您的人工使用(float c = dummyAttrib)属性将被优化。问题是你的网格编制逻辑在这种情况下所做的。如果它从GL查询使用的属性,它什么都不会得到。没有顶点属性传递,原始图不会被绘制(我的Radeon 2400HD在任何Catalyst上的行为)。因此,基本上,如果GL报告属性根本没有,那么应该传递一个人为的非使用属性(类似于某个未初始化的缓冲区上每个顶点的1个字节)。

+0

伟大的是,别人体验与退出属性相同的行为。我先问过这里,但如果我昨天没有回答,我会在整天不同的催化剂版本之间切换。然而,如果属性被选择退出,如何查询?我已经使用了'glGetActiveAttrib'并且这个名字返回了“dummyAttrib”。还意味着从单位缓冲区传递1个字节?闻起来像访问冲突。 – Raven

+0

如果'glGetActiveAttrib'在*两种情况下都返回'dummyAttrib' - 看起来像一个谜,你需要一个测试用例发送给ATI。在_allocated_中传递1-byte-vert-vertex属性,但未初始化的缓冲区不会成为访问冲突。 – kvark

+0

第二种情况是什么?我在连接着色器后查询了一下。并且对于那个没有初始化的缓冲区 - 我知道你现在的意思,但是与我现在正在做的事情有什么不同(除了该字节比float小四倍)?如果实际上GL会报告存在非可用性,我该如何设置属性。我可以通过内置属性来做到这一点,但我不想搞砸这些(我从这里得到了足够的这些奇怪的错误) – Raven