- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我将非最大值传递到纹理缓冲区时,在渲染时它会绘制具有最大值颜色的几何图形。我在使用 glTexBuffer() API 时发现了这个问题。
例如假设我的纹理数据是GLubyte,当我传递任何小于255的值时,那么颜色与用255绘制的颜色相同,而不是黑色和该颜色的混合。
我在AMD和nvidia卡上尝试过,但结果是一样的。你能告诉我哪里出了问题吗?
我在这里复制我的代码:
垂直着色器:
in vec2 a_position;
uniform float offset_x;
void main()
{
gl_Position = vec4(a_position.x + offset_x, a_position.y, 1.0, 1.0);
}
碎片着色器:
out vec4 Color;
uniform isamplerBuffer sampler;
uniform int index;
void main()
{
Color=texelFetch(sampler,index);
}
代码:
GLubyte arr[]={128,5,250};
glGenBuffers(1,&bufferid);
glBindBuffer(GL_TEXTURE_BUFFER,bufferid);
glBufferData(GL_TEXTURE_BUFFER,sizeof(arr),arr,GL_STATIC_DRAW);
glBindBuffer(GL_TEXTURE_BUFFER,0);
glGenTextures(1, &buffer_texture);
glBindTexture(GL_TEXTURE_BUFFER, buffer_texture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, bufferid);
glUniform1f(glGetUniformLocation(shader_data.psId,"offset_x"),0.0f);
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);
在本例中,它用深红色绘制所有 3 个正方形。
最佳答案
uniform isamplerBuffer sampler;
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, bufferid);
这就是你的问题:它们不匹配。
您将纹理的存储创建为无符号 8 位整数,在读取时将其标准化为 float 。但是您告诉着色器您要为其提供有符号 8 位整数,这些整数将被读取为整数,而不是 float 。
你因不一致而混淆了 OpenGL。采样器类型与纹理格式不匹配会产生未定义的行为。
那应该是 samplerBuffer
,而不是 isamplerBuffer
。
关于opengl - 使用 texelFetch() 进行纹理化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12834058/
这个问题在这里已经有了答案: 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
我是一名优秀的程序员,十分优秀!