C++ OpenGL 2d纹理类是';不工作,但相同的代码在主循环的类外工作?
我正在学习OpenGL,我想把2D纹理代码放到一个类中。代码在主文件中运行良好,但复制并粘贴到纹理类中的相同代码根本不起作用。导致黑色。我尝试过使用错误检查,但没有结果。我想知道为什么它不起作用 Main.cpp文件:C++ OpenGL 2d纹理类是';不工作,但相同的代码在主循环的类外工作?,c++,opengl,texture2d,C++,Opengl,Texture2d,我正在学习OpenGL,我想把2D纹理代码放到一个类中。代码在主文件中运行良好,但复制并粘贴到纹理类中的相同代码根本不起作用。导致黑色。我尝试过使用错误检查,但没有结果。我想知道为什么它不起作用 Main.cpp文件: #include <iostream> #include <chrono> #include <thread> #include "GL/glew.h" #include "GLFW/glfw3.h"
#include <iostream>
#include <chrono>
#include <thread>
#include "GL/glew.h"
#include "GLFW/glfw3.h"
#define STB_IMAGE_IMPLEMENTATION
#include "STB/stb_image.h"
#include "Shader.h"
#include "Texture2D.h"
using namespace std::chrono_literals;
//Keeps viewport same size of window when the window is resized
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window) {
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
if (glfwGetKey(window, GLFW_KEY_F) == GLFW_PRESS)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
else
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
int main() {
stbi_set_flip_vertically_on_load(true);
//Vertices and Indices
float vertices[] = {
// positions // colors // texture coords
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // top left
};
unsigned int indices[] = { // note that we start from 0!
0, 2, 3, // first triangle
0, 1, 2 // second triangle
};
//GLFW Initialization
if (!glfwInit()) { std::cerr << "Shit, GLFW Didn't INIT Properly" << std::endl; std::this_thread::sleep_for(3s); return -1; }
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//GLFW Window Creation
GLFWwindow* w = glfwCreateWindow(800,600,"WET ASS PUSSY",NULL,NULL);
if (!w) { glfwTerminate(); std::cerr << "Failed to Make Window" << std::endl; std::this_thread::sleep_for(3s); return -1; }
glfwMakeContextCurrent(w);
//GLEW Initialization
if (glewInit() != GLEW_OK) { glfwTerminate(); std::cerr << "Shit, GLEW Didn't Init Properly" << std::endl; std::this_thread::sleep_for(3s); return -1; }
std::cout << glGetString(GL_VERSION) << std::endl;
//Viewport and Window Resizing Callback Setup
glViewport(0, 0, 800, 600);
glfwSetFramebufferSizeCallback(w, framebuffer_size_callback); //Fn set as callback when resizing window
/*
//Create Texture
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// set the texture wrapping/filtering options (on the currently bound texture object)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//Load Texture Data
int width, height, nrChannels;
unsigned char* data = stbi_load("Textures/stoneBrickWall.jpg", &width, &height, &nrChannels, 0);
if (data)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);
*/
Texture2D tex("Textures/stoneBrickWall.jpg", GL_RGB, GL_RGB, GL_REPEAT, GL_LINEAR);
//Vector Buffer/Element Buffer/Vector Array Handling
unsigned int vBuff;
glGenBuffers(1, &vBuff);
unsigned int EBO;
glGenBuffers(1, &EBO);
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, vBuff);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
//glBindTexture(GL_TEXTURE_2D, texture);
tex.use();
//Vertex Handling Instructions
//Position
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//Color
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
//Texture
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);
glBindVertexArray(0);
//Make Shader
Shader shader("Shader.vs", "Shader.fs");
shader.use();
//Render Loop
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
while (!glfwWindowShouldClose(w)) {
processInput(w);
glClear(GL_COLOR_BUFFER_BIT);
//render here--
shader.use();
glBindVertexArray(VAO);
tex.use();
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glUseProgram(0);
glBindVertexArray(0);
//--
glfwSwapBuffers(w);
glfwPollEvents();
}
//Cleanup
glfwDestroyWindow(w);
glfwTerminate();
return 0;
}
#包括
#包括
#包括
#包括“GL/glew.h”
#包括“GLFW/glfw3.h”
#定义机顶盒映像的实现
#包括“机顶盒/机顶盒图像.h”
#包括“Shader.h”
#包括“纹理2d.h”
使用名称空间std::chrono_文本;
//调整窗口大小时,保持视口与窗口大小相同
无效帧缓冲区大小回调(GLFWwindow*窗口,整型宽度,整型高度){
glViewport(0,0,宽度,高度);
}
无效进程输入(GLFWwindow*窗口){
如果(glfwGetKey(窗口,GLFW_键_退出)==GLFW_按)
glfwSetWindowShouldClose(窗口,真);
如果(glfwGetKey(窗口,GLFW_键F)==GLFW_按)
glPolygonMode(GLU前、后、GLU线);
其他的
glPolygonMode(GLU前、后、GLU填充);
}
int main(){
stbi设置垂直翻转加载(真);
//顶点和索引
浮动顶点[]={
//位置//颜色//纹理坐标
0.5f、0.5f、0.0f、1.0f、0.0f、0.0f、1.0f、1.0f、//右上角
0.5f,-0.5f,0.0f,0.0f,1.0f,0.0f,1.0f,0.0f,//右下角
-0.5f,-0.5f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,//左下角
-0.5f、0.5f、0.0f、1.0f、1.0f、0.0f、0.0f、1.0f//左上角
};
无符号整数索引[]={//请注意,我们从0开始!
0,2,3,//第一个三角形
0,1,2//第二个三角形
};
//GLFW初始化
如果(!glfwInit()){std::cerr这个构造函数就是问题所在:
Texture2D(const char* imgPath, GLint internalFormat, GLenum format, GLint wrapMode, GLint filterMode) {
Texture2D(imgPath, internalFormat, format, wrapMode, wrapMode, filterMode, filterMode);
}
这将创建一个类型为Texture2D的匿名局部变量,然后将其丢弃,使Texture2D对象本身(其构造函数现在正在运行)完全未初始化
我想你是想用a来代替。区别很微妙但很重要:
Texture2D(const char* imgPath, GLint internalFormat, GLenum format, GLint wrapMode, GLint filterMode)
: Texture2D(imgPath, internalFormat, format, wrapMode, wrapMode, filterMode, filterMode) {}
我很惊讶这一切都能正常工作,因为您的第三个glvertexattributepointer调用声明,即使8-float结构中只剩下2个浮点数,它也会吃掉3个浮点数(position需要3个浮点数,color需要3个浮点数)你的着色器是什么样子的?你在哪里为纹理采样器制服指定了0?这就是解决方案,我犯了一个非常愚蠢的错误。谢谢你花时间来帮助我。
Texture2D(const char* imgPath, GLint internalFormat, GLenum format, GLint wrapMode, GLint filterMode) {
Texture2D(imgPath, internalFormat, format, wrapMode, wrapMode, filterMode, filterMode);
}
Texture2D(const char* imgPath, GLint internalFormat, GLenum format, GLint wrapMode, GLint filterMode)
: Texture2D(imgPath, internalFormat, format, wrapMode, wrapMode, filterMode, filterMode) {}