我正试图根据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.0
,255.0
,但什么都没有。
要么书上没提到什么,要么我错过了什么愚蠢的东西。为什么纹理拒绝在飞机上显示?
编辑:我在绘图部分添加了一些代码。我绘制的其余几何体(使用不同的着色器)显示得非常完美。它们都不使用纹理。
我终于解决了这个问题,尽管还不清楚问题到底是什么。
我使用glTexImage2D
而不是glTexStorage2D
和glTexSubImage2D
获得要显示的纹理。
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: