Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL 2d纹理类是';不工作,但相同的代码在主循环的类外工作?_C++_Opengl_Texture2d - Fatal编程技术网

C++ OpenGL 2d纹理类是';不工作,但相同的代码在主循环的类外工作?

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"

我正在学习OpenGL,我想把2D纹理代码放到一个类中。代码在主文件中运行良好,但复制并粘贴到纹理类中的相同代码根本不起作用。导致黑色。我尝试过使用错误检查,但没有结果。我想知道为什么它不起作用

Main.cpp文件:

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