当前位置: 首页 > 知识库问答 >
问题:

OpenGL-texelFetch什么都不获取

魏刚豪
2023-03-14

我正试图根据OpenGL SuperBible第六版绘制一个纹理平面。但由于某些原因,我失败了。

这是我的纹理初始化代码。

GLuint texture;
glGenTextures(1, &texture);
glActiveTexture(GL_TEXTURE0);
int w = 256;
int h = 256;
glBindTexture(GL_TEXTURE_2D, texture);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, w, h);
float * data = new float[w * h * 4];
//This just creates some image data
generateTexture(data, w, h);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_FLOAT, data);
delete [] data;

这是平面对象。对象本身是绘制的,只是没有纹理。

glGenBuffers(1, &planeBuffer);
glBindBuffer(GL_ARRAY_BUFFER, planeBuffer);
glBufferData(GL_ARRAY_BUFFER,
             sizeof(planePositions),
             planePositions,
             GL_STATIC_DRAW);

这些是我的顶点和片段着色器。

#version 430 core
layout (location = 0) in vec3 position;
uniform mat4 proj, view;
void main(void){      
      gl_Position = proj * view * vec4 (position, 1.0);      
}


#version 430 core
uniform sampler2D s;
out vec4 frag_color;
void main () {
    frag_color = texelFetch(s, ivec2(gl_FragCoord.xy), 0);
};

我这样画

glUseProgram(textureProgram);

GLuint projLocation = glGetUniformLocation (textureProgram, "proj");
glUniformMatrix4fv (projLocation, 1, GL_FALSE, projectionSource);

GLuint viewLocation = glGetUniformLocation (textureProgram, "view");
glUniformMatrix4fv (viewLocation, 1, GL_FALSE, viewSource);

glBindBuffer(GL_ARRAY_BUFFER, planeBuffer);
GLuint positionLocation = glGetAttribLocation(textureProgram, "position");
glVertexAttribPointer (positionLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL);               
glEnableVertexAttribArray (positionLocation);

glActiveTexture(GL_TEXTURE0);    
glBindTexture(GL_TEXTURE_2D, texture);                 
GLuint ts = glGetUniformLocation (textureProgram, "s");
glUniform1i(ts, 0);

glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray (positionLocation);                           

//Afterwards I draw more geometry with other shaders. This shows correctly
glUseProgram(shaderProgram);
//Bind buffers, matrices, drawarrays, etc

但我刚买了一架黑色的飞机。如果我通过在后面添加另一行来覆盖frag_color赋值,如下所示

frag_color = vec4(1.0);

它可以工作,也就是说,我得到了一个白色平面,所以着色器似乎工作正常。

我没有从glGetError()中得到任何错误。

兼容性:

OpenGL version supported: 4.2.12337 Compatibility Profile Context 13.101
GLSL version supported: 4.30

数据数组包含0到1之间的值。我还尝试将一些随机坐标编码到texelFetch()函数中,但我总是得到一个黑色平面。看起来采样器2D只包含零。我还尝试将数据中包含的值编码为1.0255.0,但什么都没有。

要么书上没提到什么,要么我错过了什么愚蠢的东西。为什么纹理拒绝在飞机上显示?

编辑:我在绘图部分添加了一些代码。我绘制的其余几何体(使用不同的着色器)显示得非常完美。它们都不使用纹理。


共有1个答案

屈浩波
2023-03-14

我终于解决了这个问题,尽管还不清楚问题到底是什么。

我使用glTexImage2D而不是glTexStorage2DglTexSubImage2D获得要显示的纹理。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_FLOAT, data);

我还必须显式设置参数,即使我使用的是texelFetch()

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

没有必要明确地约束制服。

奇怪的是,根据文档,glTexStorage2D相当于:

for (i = 0; i < levels; i++) {
    glTexImage2D(target, i, internalformat, width, height, 0, format, type, NULL);
    width = max(1, (width / 2));
    height = max(1, (height / 2));
}

然而,这种组合并不起作用。

glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA, w, h);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_FLOAT, data);

我还得弄清楚为什么会这样,但至少我让它起作用了。

 类似资料:
  • 在Java中,什么与Python的pass等效?我意识到我可以使用continue语句或不完成语句体来实现这种效果,但我喜欢使用pass语句。

  • 我的配置文件是类路径的路径。至少我认为是这样。我放置了log4j。资源文件夹中的属性文件,而log4j对此不做任何处理。即使我删除了它,也不会发生错误。 任何人都可以看到,我在使用maven LoggerTest的内容: 程序输出: log4j的内容。属性: 在波姆。xml并不是什么不同寻常的东西,只是一个依赖组织。阿帕奇。登录中。log4j log4j内核2.17.2,编译器源目标是16,没有插

  • 因此,我使用javafx创建了这个应用程序,它有一个登录屏幕,但我在这方面没有任何成功,我已经在这个项目的这个小部分工作了一些天,它根本不能以任何方式工作。我尝试这样做,我看了一些教程,其中大部分都是像下面的代码一样,但它对我来说不起作用,如果有人能帮我解释为什么我的标签文本没有改变(这就是我如何测试登录是否成功),这将是很好的,下面是代码: 控制器: FXML格式

  • 问题内容: 我有以下定制JPanel,并且已使用Netbeans GUI构建器将其添加到我的框架中,但是背景不会改变!我可以看到用g.fillOval()绘制的圆圈。怎么了? 问题答案: 如果面板“不透明”(透明),您将看不到背景色。

  • 在Windows10中输入以下命令并启动无头chrome版本时,没有发生任何事情(有/没有扩展): 它只是悄悄地返回到命令行,我找不到任何pdf文件。 有人遇到过同样的问题并设法解决了吗? 我正在使用:Google Chrome 63.0.3239.84(官方版本)(64位)(队列:63_Win_84)

  • 问题内容: 以下是ajax请求。 这就是delete.php 运行代码后,它将成功删除文件,但不会显示任何消息。 我也尝试将ajax请求更改为: 仍然不显示该消息。所以我想在delete.php文件中出了点问题。请帮忙。 问题答案: 进行jquery + ajax + php的最佳方法如下: jQuery的: PHP: