Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl Can';t获取在GLSL 1.5中工作的整数顶点属性_Opengl_Attributes_Integer_Glsl - Fatal编程技术网

Opengl Can';t获取在GLSL 1.5中工作的整数顶点属性

Opengl Can';t获取在GLSL 1.5中工作的整数顶点属性,opengl,attributes,integer,glsl,Opengl,Attributes,Integer,Glsl,我将OpenGL 3.2上下文与GLSL 1.5一起使用,出于某种原因,整数属性(int、uint、ivecX或uvecX类型)在顶点着色器中始终被读取为0。我使用以下方法声明它们: in int name; 我使用glVertexAttribIPointer(注意I)绑定属性,而不是glVertexAttribPointer(但该指针也不起作用)。如果我将它们改为float,它们的工作就非常好了——唯一的代码区别是vertex结构中的类型、GLSL中的类型以及IPointer函数调用,而不仅

我将OpenGL 3.2上下文与GLSL 1.5一起使用,出于某种原因,整数属性(int、uint、ivecX或uvecX类型)在顶点着色器中始终被读取为0。我使用以下方法声明它们:

in int name;
我使用glVertexAttribIPointer(注意I)绑定属性,而不是glVertexAttribPointer(但该指针也不起作用)。如果我将它们改为float,它们的工作就非常好了——唯一的代码区别是vertex结构中的类型、GLSL中的类型以及IPointer函数调用,而不仅仅是指针。我没有收到任何错误或任何东西,它们都是0。如果我改为硬编码整数值,它工作得很好,整型制服也工作得很好。此外,像gl_VertexID这样的内置整数工作得很好,只是定制的整数不行。我正在运行ATI Mobility Radeon HD 5870。我在另一台电脑上试用了不同的GPU(不幸的是,我不确定是什么GPU,但它和我的不同),结果是一样的。你知道为什么会这样吗?谢谢

编辑:实际上看起来它们不是0,更有可能是随机的大的未初始化值。。。很难说,因为我找不到任何调试GLSL着色器的方法。总之,还有更多的信息。这是我的顶点结构:

struct TileVertex {
    float pos[2];
    float uv[2];
    float width;
    float pad;
    int animFrames;
    int animFrameLength;
};
animFrames和animFrameLength是我试图发送到着色器的两个整数值。我对animFrames的GlvertexAttributionInter的调用如下:

glVertexAttribIPointer( attribute.location, attribute.typeSize, attribute.baseType, (GLsizei)stride, bufferOffset( bufOffset + attribOffset ) );
其中:

attribute.location = 1 (as determined by OpenGL)
attribute.typeSize = 1 (since it's a single int, not a vector)
attribute.baseType = 5124, which is GL_INT
stride = 32, which is sizeof( TileVertex )
bufferOffset() converts to a void pointer relative to NULL
bufOffset = 0 (my vertices start at the beginning of the VBO), and
attribOffset = 24, which is the offset of animFrames in the TileVertex struct
编辑:谢谢大家迄今为止的帮助。所以我尝试使用转换反馈,现在事情变得更有意义了。如果我将int attrib的值设置为1,则在着色器中它是:

1065353216 = 0x3F800000 = 1.0 in floating point
如果将其设置为10,则在着色器中会得到:

1092616192 = 0x41200000 = 10.0 in floating point
所以看起来int属性被转换为float,然后这些位在着色器中被解释为int,即使我指定了GL_int并使用IPointer而不是指针!据我所知,IPointer应该只保留整数形式的数据,而不是将其转换为浮点

编辑:

这里还有一些测试。对于每个测试,我尝试将整数值1传递给着色器中的整数输入:

glVertexAttribIPointer with GL_INT: shader values are 0x3F800000, which is 1.0 in floating point
似乎表示整数1正在转换为浮点1.0,然后被解释为整数。这意味着OpenGL要么认为源数据是浮点形式(实际上是整数形式),要么认为着色器输入是浮点形式(实际上是整数形式)

不知道这意味着什么。我传递的唯一值是整数1,所以我无法理解为什么每个值会不同,或者为什么它们会是有效的浮点!我这样做的逻辑是,如果OpenGL将整数转换为浮点数,也许告诉它它们已经是浮点数可以避免这种情况,但显然不是

glVertexAttribPointer with GL_INT: same result as glVertexAttribIPointer with GL_INT
这是预期的结果。OpenGL将整数转换为浮点,然后将其传递给着色器。这是应该发生的,因为我没有使用I版本

glVertexAttribPointer with GL_FLOAT: integer values 1 (the correct result)
这是因为OpenGL 1)认为源数据是浮点形式,2)认为着色器输入也是浮点形式(它们实际上是int和int),因此不应用任何转换,将int保留为int(或它认为的浮点形式)。这是可行的,但它看起来非常粗糙和不可靠,因为我认为不能保证CPU浮点到GPU浮点不需要转换(有些GPU不使用16位浮点吗?也许这只是OpenGL 3之前的版本,但仍然如此)-它只是不在我的GPU上。

对于其中一个着色器(不记得是哪个),您需要使用
variable
关键字。或者可能是
属性
关键字。GLSL的更高版本使用
in
out

我认为你需要:

attribute int name;
对于要转到顶点着色器的数据,以及

varying int name;
用于从顶点着色器到片段着色器的数据

还请确保使用启用着色器属性


我在使
int
atributes也工作时遇到了一些问题,但我确实发现
type
字段(
GL_int
GL_FLOAT
传递到
glvertexattributepointer
与传递给它的数据匹配,而不是着色器中的数据类型)。因此,我最终使用了
glvertexattributepointer
GL_INT
将主机上的
INT
转换为着色器中的
float
,这对我来说很好,因为我的属性是位置数据,无论如何都需要通过浮点
vec2
进行转换


可能您需要
glvertexattributepointerext
来匹配着色器
int
属性,如果主机以
int
数组提供数据,则还需要
GL\u int

我知道这个问题很老了,但此信息可能仍然有用:

GLint
的大小为32位, 但是C中的
int
也可能是64位

这让我调试的时间太长了;博士:

glvertexattributepointer
将把您的输入转换为float,即使
normalized
参数为
false


glVertexAttribIPointer
只接受整数,没有
标准化的
参数。

In-Out是由glsl 1.5引入的,而属性是从glsl 1.5中弃用的。@Luca:谢谢,我几乎无法保持我使用的版本,更不用说所有的旧版本了。@Luca:它们是在1.30中引入的。Ops。。。这是真的(总是混淆这两个版本,叹气)我有一个模拟问题,而改为glvertexattributepointer解决了这个问题。即使normalize参数为GL_FALSE,GL_INT也被规格化。(Radeon 7850,crimson)给我们更多信息。显示对glVertexAttribIPointer的调用,并显示您尝试传递的数据。您可以通过使用变换反馈并将目标缓冲区读回主内存来调试顶点GLSL着色器。您的属性索引是否为0?你所拥有的第一个价值观
varying int name;