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

OpenGL 3.1纹理未加载

阎伟志
2023-03-14

我一直试图让纹理在opengl 3.1下工作,在ubuntu 13.04上运行的intelHD图形2000/3000显卡上。我遇到的问题是纹理要么不加载,我试图纹理的基本三角形变成黑色,要么纹理中的一些颜色会加载,但不会加载整个图像。我使用原始图像文件作为源或使用libjpeg加载jpeg得到相同的结果。

我的着色器如下所示:

#version 130

in vec3 vert;
in vec2 vertTextCoord;

out vec2 fragTexCoord;

void main(){
    fragTexCoord = vertTextCoord;
    gl_Position = vec4(vert,1);

}
#version 130

uniform sampler2D tex;

in vec2 fragTexCoord;

out vec4 finalColor;

void main() {

    finalColor = texture(tex, fragTexCoord);
}

创建纹理glGenTexture(1,

imgdata image_data = loadRaw("texture.bmp", 256, 256);

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);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE,image_data.data);

还有渲染功能

void display(void){
glClearColor( 1.f, 0.f, 0.f, 0.f);
glClear(GL_COLOR_BUFFER_BIT );

//load program to use
glUseProgram(shaderprogram);

GLint uniform = glGetUniformLocation(shaderprogram, "tex");
if(uniform == -1){
    throw std::runtime_error(std::string("program uniform not found: tex"));
}

// bind the texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(uniform, 0);

//load vertex array to use
glBindVertexArray(cubeVAO);

//draw triangle
glDrawArrays(GL_TRIANGLES, 0, 3);

//unbind for next pass
glBindVertexArray(0);
glUseProgram(0);

glfwSwapBuffers();
}

几何和纹理坐标

GLfloat data[] = {
//X   Y    Z     U    V
0.0f, 0.8f, 0.0f,      0.5f, 1.0f,
-0.8f, -0.8f, 0.0f,    0.0f, 0.0f,
0.8f, -0.8f, 0.0f,     1.0f, 0.0f
};

正在设置VBO和VAO

glGenVertexArrays(1, &cubeVAO);
glBindVertexArray(cubeVAO);
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);


glEnableVertexAttribArray(vertprog);
glVertexAttribPointer(vertprog, 3, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), NULL);

glEnableVertexAttribArray(verttexprog);
glVertexAttribPointer(verttexprog, 2, GL_FLOAT, GL_TRUE, 5*sizeof(GLfloat), (const GLvoid*)(3*sizeof(GLfloat)));

glBindVertexArray(0);

共有1个答案

程淮晨
2023-03-14

您尚未显示确定verttexprog值的代码。根据您当前的代码,我必须假设verttexprog(顺便说一下,这是一个糟糕的变量名)未初始化。

您应该将verttexprog初始化为glGetAttribLocation(程序,“verttexCoord”) 链接程序后。同样,不要在每一帧中查询统一的位置,它们唯一改变的时间是在您(重新)链接GLSL程序之后。

finalColor = texture(tex, fragTexCoord);

与:

finalColor = texture(tex, gl_FragCoord.st);

这不是你想要的行为,但这是一个很好的方式来显示你的纹理加载良好。

 类似资料:
  • 我正在尝试自学java语法,并将minecraft作为一个平台进行深入研究。但是我遇到了一个问题,因为没有加载我的纹理。就这点而言,我的本地化也是如此。这是我的代码块 这是我的课程 我的纹理保存在 根据日志,它无法找到我的纹理。这是我得到的信息 客户端加载并显示“我的项目”,但带有默认的黑色和紫色纹理。我做错了什么?我想这可能与我的命名约定有关,因为。lang文件也不会被读取,我给我的块起一个友好

  • 嘿,我不能让我的纹理出现,我不知道怎么了。辅导没有帮助。这是我的代码: spriteX=0,spriteY=0,spriteW=400,spriteL=400,x=0,y=0 这是我得到的输出:输出窗口 正如你所见,黑色三角形显示得很好,但没有纹理

  • 加载纹理贴图集 可以使用Pixi的loader来加载纹理贴图集。如果是用Texture Packer生成的JSON,loader会自动读取数据,并对每一个帧创建纹理。下面就是怎么用loader来加载treasureHunter.json。当它成功加载,setup方法将会执行。 loader .add("images/treasureHunter.json") .load(setup); 现

  • 我刚刚开始学习Java,同时修改Minecraft。我已经看了一个关于使用Minecraft Forge API将块添加到游戏中的教程,但是我有一个问题。不再有“.setBlockTextureName()”方法,所以我不知道该怎么做。我有一个简单的块添加到我的游戏,但它没有纹理,我想添加一个纹理到它。我该如何为Minecraft 1.8做这件事呢? 附注:如果这是一个副本,我很抱歉,我只看到关于

  • 译注 注意,由于作者对教程做出了更新,之前本节使用的是SOIL库,但现在改为了使用stb_image.h库,关于SOIL配置的部分现在已经被修改,但我仍决定将这部分教程保留起来,放到一个历史存档中,如果有需要的话可以到这里来查看。 我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会

  • 将图片加载后创建纹理对象,纹理将直接用于绘制 createTextures(object) 纹理异步加载,批量异步加载接口 手Q版本:7.8.0 函数参数object属性: 属性名 类型 是否必填 说明 file Array 是 要加载的图片文件数组 success Function 否 接口调用成功回调 fail Function 否 接口调用失败回调 complete Function 否 接