gpt4 book ai didi

c++ - 现代 OpenGL 3.3 核心黑色纹理

转载 作者:行者123 更新时间:2023-11-28 04:52:36 28 4
gpt4 key购买 nike

我正在尝试使用 OpenGL 绘制一个 png 文件,但似乎对我设置纹理的方式有疑问。

主要.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();
}

顶点着色器:

#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);
}

片段着色器:

#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,所以我不一定了解所有开始的概念。纹理可能超出了我的技能水平,但我认为尝试在这里询问并没有什么坏处,因为有人可能会告诉我我在哪里感到困惑。

最佳答案

您在渲染循环中调用 glBindTexture(GL_TEXTURE_2D, 0) 而不是 glBindTexture(GL_TEXTURE_2D, m_texture)。使用此命令,纹理将绑定(bind)到当前事件的纹理单元。

关于c++ - 现代 OpenGL 3.3 核心黑色纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47849641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com