- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
片段着色器:
out vec4 Color;
uniform samplerBuffer sampler;
uniform int index;
void main()
{
Color=normalize(texelFetch(sampler,index));
}
我正在使用 glTexBuffer() 对 http://www.opengl.org/sdk/docs/man3/xhtml/glTexBuffer.xml 中给出的所有内部格式进行纹理处理。 .以上着色器仅适用于 ubyte、ushort 规范化类型和 float、halffloat 非规范化类型。对于其余的内部格式,它不会在几何体上应用纹理。
我需要更改什么才能达到预期的效果?
代码
GLbyte arr[]={124,5,126};
glGenBuffers(1,&bufferid);
glBindBuffer(GL_TEXTURE_BUFFER,bufferid);
glBufferData(GL_TEXTURE_BUFFER,sizeof(arr),arr,GL_STATIC_DRAW);
glGenTextures(1, &buffer_texture);
glBindTexture(GL_TEXTURE_BUFFER, buffer_texture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8I, bufferid);
glUniform1i(glGetUniformLocation(shader_data.psId,"sampler"),0);
glUniform1i(glGetUniformLocation(shader_data.psId,"index"),0);
glGenBuffers(1,&bufferid1);
glBindBuffer(GL_ARRAY_BUFFER,bufferid1);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices4),vertices4,GL_STATIC_DRAW);
attr_vertex = glGetAttribLocation(shader_data.psId, "a_position");
glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0, 0);
glEnableVertexAttribArray(attr_vertex);
glDrawArrays(GL_TRIANGLE_FAN,0,4);
glUniform1i(glGetUniformLocation(shader_data.psId,"index"),1);
glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(32) );
glDrawArrays(GL_TRIANGLE_FAN,0,4);
glUniform1i(glGetUniformLocation(shader_data.psId,"index"),2);
glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(64) );
glDrawArrays(GL_TRIANGLE_FAN,0,4);
我必须使用所有内部格式应用纹理。
最佳答案
如果“期望的效果”是拥有一个可以处理任何格式图像数据的单一 着色器,那么就没有办法做到这一点。或者至少,没有简单的方法。
您可以拥有三个不同的采样器,绑定(bind)到三个不同的纹理图像单元,对应于三种不同的可能格式(float、signed-int、unsigned-int)。您创建 3 个不同的缓冲区纹理(使用相同的缓冲区),并将适当的纹理绑定(bind)到适当的采样器,以获取您希望着色器使用的数据类型。然后你传递一个定义应该使用哪个采样器的制服。
但是除了像这样的条件逻辑,没有。采样器的类型用于确定如何解释提供给着色器的数据,并且它必须与纹理的格式相匹配。
一般来说,着色器被设计为期望某些特定数据,而不是客户端代码想要扔给它的任何旧的任意东西。从纹理中提取 float 的着色器不关心它是归一化整数还是 16 位 float ,或者 R11F_G11F_B10F 或其他什么;着色器只需要 float 。在需要 float 的着色器中推送图像是不合适的。
关于opengl - texelFetch() 中的 samplerBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12836841/
这个问题在这里已经有了答案: OpenGL Texture Coordinates in Pixel Space (3 个回答) 4年前关闭。 我正在使用 GLSL,需要一些纹理查找方面的帮助。我正在
我的程序显示从带有 openGL 的网络摄像头加载的 openCV 图像。 下面的程序通常可以工作,但我在代码后列出了一些问题。 主要的: #define GLEW_STATIC #include
当我将非最大值传递到纹理缓冲区时,在渲染时它会绘制具有最大值颜色的几何图形。我在使用 glTexBuffer() API 时发现了这个问题。 例如假设我的纹理数据是GLubyte,当我传递任何小于25
片段着色器: out vec4 Color; uniform samplerBuffer sampler; uniform int index; void main() { Color=norm
目前我使用函数 texture(...) 读取 3D 纹理,如下所示: vec3 值 = texture(texture_3D, coord).rgb 我现在要做的是: vec3 值 = texelF
我试过: #version 130 uniform sampler2D texID; in vec2 texcoord; out vec4 outcolor; void main(void) {
尝试在 OpenGL 桌面中渲染一个矩形,但 glTexBuffer(...) 中使用的内部格式和 texelFetch(...) 的相应代码不是为我工作。我有正确的原始渲染,只需要更正纹理缓冲区部分
我正在使用 OpenGL es 3.0 和我的 GLSL 版本 #version 300 es。 我正在尝试计算 GPU 中的发光直方图。我已经确定我的设备支持顶点纹理获取并尝试使用 texelFet
我是一名优秀的程序员,十分优秀!