现代OpenGL 3.3核心黑色纹理
Modern OpenGL 3.3 Core Black Texture
我正在尝试使用OpenGL绘制PNG文件,并且似乎对如何设置纹理有问题。
main.cpp:
float positions[] = {
-1.0f, -1.0f,
0.0f, 1.0f,
1.0f, 1.0f,
};
float texCoords[] = {
-1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f,
};
unsigned int buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
unsigned int texBuffer;
glGenBuffers(1, &texBuffer);
glBindBuffer(GL_ARRAY_BUFFER, texBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
int w;
int h;
int comp;
unsigned char* image = stbi_load("res/images/background_level.png", &w, &h, &comp, STBI_rgb_alpha);
if (image == nullptr)
throw(std::string("Failed to load texture"));
//std::cout << image << std::endl;
unsigned int m_texture;
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
if (comp == 3)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
else if (comp == 4)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
glBindTexture(GL_TEXTURE_2D, 0);
stbi_image_free(image);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
// draw our first triangle
glUseProgram(programID);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);
int uniformLoc = glGetUniformLocation(programID, "tex");
glUniform1i(uniformLoc, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
vertex.shader:
#shader VERTEX
#version 330 core
layout (location=0) in vec2 vert;
layout (location=1) in vec2 vertTexCoord;
out vec2 fragTexCoord;
void main() {
// Pass the tex coord straight through to the fragment shader
fragTexCoord = vertTexCoord;
gl_Position = vec4(vert, 0, 1);
}
fragment.shader:
#shader FRAGMENT
#version 330 core
uniform sampler2D tex; //this is the texture
in vec2 fragTexCoord; //this is the texture coord
out vec4 finalColor; //this is the output color of the pixel
void main() {
//finalColor = vec4(1.0, 1.0, 1.0, 1.0);
finalColor = texture(tex, fragTexCoord);
}
如果我在片段着色器中交换了线条,我会呈现一个全白三角。但是,随着线条试图使用纹理,三角形出现了全黑。我只是从OpenGL开始,所以我不一定会将所有开始概念放在PAT上。纹理可能领先于我的技能水平,但我认为尝试在这里询问这不会有什么伤害
您在Renderloop中调用glBindTexture(GL_TEXTURE_2D, 0)
而不是glBindTexture(GL_TEXTURE_2D, m_texture)
。使用此命令,纹理绑定到当前活动的纹理单元。
相关文章:
- 为什么我会得到黑色纹理?
- 黑色纹理,如果图片大小在第二个 OpenGL 线程中> 1 * 1
- 纹理显示为黑色
- 现代OpenGL 3.3核心黑色纹理
- 带有Clang的DirectX11显示黑色纹理(与Visual Studio配合使用)
- Direct3D11:在设备之间共享纹理:黑色纹理
- 使用着色器渲染时,OpenGL纹理都是黑色的
- 片段着色器中的 OpenGL 纹理黑色
- opengl-黑色纹理,如何在缓冲区上使用glm::vec*
- GLSL 150 GL 3.2黑色纹理
- GLSL纹理功能仅返回黑色的天空盒
- 从libpng加载的png纹理在OpenGL中显示为黑色
- OpenGL 3.3不会渲染任何纹理(黑色纹理、C++、GLFW/SOIL)
- OpenGL3两组着色器,纹理显示为黑色
- GLSL 将纹理渲染为黑色和蓝色
- OpenGL 3.30/GLSL 3.30-MRT输出黑色纹理
- SDL_CreateRGBSurface使用OpenGL纹理产生黑色纹理
- OpenGL CubeMapping黑色纹理
- OpenGL中纹理的采样是黑色的
- OpenGL纹理在3.3中都是黑色的-但在3.1中工作