opengl在尝试应用纹理时崩溃

opengl在尝试应用纹理时崩溃,opengl,Opengl,我正在尝试将纹理应用到opengl程序中,但该程序由于某种原因而崩溃,有人能告诉我我做错了什么吗?现在尝试修复此问题两天:/fragment shader中的颜色设置为某个随机颜色时效果良好,但当颜色为: vec4 textColor=纹理(u_纹理,v_TextCoord); 颜色=文本颜色 编辑: #define GLEW_STATIC #define alloca __builtin_alloca #include <GL/glew.h> #include <GLFW/

我正在尝试将纹理应用到opengl程序中,但该程序由于某种原因而崩溃,有人能告诉我我做错了什么吗?现在尝试修复此问题两天:/fragment shader中的颜色设置为某个随机颜色时效果良好,但当颜色为: vec4 textColor=纹理(u_纹理,v_TextCoord); 颜色=文本颜色

编辑:

#define GLEW_STATIC
#define alloca __builtin_alloca

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <stb_image.h>

using namespace std;

static string ParseShader(const string& filepath);
static unsigned int CompileShader(unsigned int type, const string& source);
static unsigned int CreateShader(const string& vertexShader, const string& fragmentShader);
void glCheckError();

    float vertex[] =
    {
    0.5f,  0.5f, 0.0f,
    1.0f, 1.0f,     // 0
    0.5f, -0.5f, 0.0f,
    1.0f, 0.0f,     // 1
    -0.5f, -0.5f, 0.0f,
    0.0f, 0.0f,     // 2
   -0.5f,  0.5f, 0.0f,
    0.0f, 1.0f      // 3
    };

    float vertexBack[] =
    {
    -0.6,  -0.6f, -0.5f,    // 0
    0.6f, -0.6f, -0.5f,     // 1
    0.6f,  0.6f, -0.5f,     // 2
    -0.6f, 0.6f, -0.5f      // 3
    };

    unsigned int indexes[] =
    {
        0, 1, 3, // first triangle
        1, 2, 3  // second triangle
    };

int main(void)
{
    GLFWwindow* window;


    /* Initialize the library */
    if (!glfwInit())
    {
        cout << "GLFW failed to load!" << endl;
        return -1;
    }

    else
        cout << "GLFW loaded" << endl << endl;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(800, 600, "Window", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;

    if(glewInit() != GLEW_OK)
        cout << "Error loading GLEW" << endl;
    else
        cout << "GLEW loaded - version: " << glGetString(GL_VERSION) << endl;

    unsigned int shader = CreateShader(ParseShader("shaders/vertex.shader"), ParseShader("shaders/fragment.shader"));
    glUseProgram(shader);


        // Make vertex position array
        unsigned int buffers;
        glGenBuffers(1, &buffers);
        glBindBuffer(GL_ARRAY_BUFFER, buffers);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);

        // Make vertex position indexes out of arrays
        unsigned int ib;
        glGenBuffers(1, &ib);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexes), indexes, GL_STATIC_DRAW);

        // Position layout
        unsigned int posAttrib = glGetAttribLocation(shader, "position");
        glEnableVertexAttribArray(posAttrib);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);

        // Texture layout
        unsigned int texAttrib = glGetAttribLocation(shader, "texCoord");
        glEnableVertexAttribArray(texAttrib);
        glCheckError();
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(3 * sizeof(float)));

        // Load image
        int h, w, v_bpp;
        unsigned char *image = stbi_load("texture.png", &w, &h, &v_bpp, 4);

        if(image == nullptr)
            cout << "failed to load image!" << endl;

        unsigned int texture_id;
        glGenTextures(1, &texture_id);
        glBindTexture(GL_TEXTURE_2D, texture_id);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
        glGenerateMipmap(GL_TEXTURE_2D);
        stbi_image_free(image);

        // Set slot
        glActiveTexture(GL_TEXTURE0);
        int location = glGetUniformLocation(shader, "u_Texture");
        glUniform1i(location, 0);



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


        glBindTexture(GL_TEXTURE_2D, 0);


    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS)
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        //glDrawArrays(GL_TRIANGLES, 0, 6);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);


        glCheckError();
        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

static string ParseShader(const string& filepath) {
    ifstream stream(filepath);

    string line;
    stringstream code;

    while(getline(stream, line))
        code << line << "\n";

    return code.str();
}

static unsigned int CompileShader(unsigned int type, const string& source) {
    unsigned int id = glCreateShader(type);
    const char* src = source.c_str();
    glShaderSource(id, 1, &src, NULL);
    glCompileShader(id);

    int result;
    glGetShaderiv(id, GL_COMPILE_STATUS, &result);

    if(result == GL_FALSE)
    {
        int length;
        glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
        char* message = (char*)alloca(length * sizeof(char));
        glGetShaderInfoLog(id, length, &length, message);
        cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "Vertex" : "Fragment") << " shader!" << endl;
        cout << message << endl;

        glDeleteShader(id);
        return 0;
    }

    return id;
}

static unsigned int CreateShader(const string& vertexShader, const string& fragmentShader) {
    unsigned int program = glCreateProgram();
    unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
    unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);

    glAttachShader(program, vs);
    glAttachShader(program, fs);
    glLinkProgram(program);
    glValidateProgram(program);

    glDeleteShader(vs);
    glDeleteShader(fs);

    return program;
}

void glCheckError() {
        GLenum err = glGetError();
        while(err!=GL_NO_ERROR) {
                string error;

                switch(err) {
                        case GL_INVALID_OPERATION:      error="INVALID_OPERATION";      break;
                        case GL_INVALID_ENUM:           error="INVALID_ENUM";           break;
                        case GL_INVALID_VALUE:          error="INVALID_VALUE";          break;
                        case GL_OUT_OF_MEMORY:          error="OUT_OF_MEMORY";          break;
                        case GL_INVALID_FRAMEBUFFER_OPERATION:  error="INVALID_FRAMEBUFFER_OPERATION";  break;
                }

                cerr << err << " (" << error.c_str() << ")" <<endl;
                err=glGetError();
        }
}
#定义GLEW#U静态
#定义alloca\uu内置的alloca
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
静态字符串解析器着色器(常量字符串和文件路径);
静态无符号整数编译器标头(无符号整数类型、常量字符串和源);
静态无符号int-CreateShader(常量字符串和顶点着色器、常量字符串和片段着色器);
void glCheckError();
浮动顶点[]=
{
0.5f,0.5f,0.0f,
1.0f,1.0f,//0
0.5f,-0.5f,0.0f,
1.0f,0.0f,//1
-0.5f,-0.5f,0.0f,
0.0f,0.0f,//2
-0.5f,0.5f,0.0f,
0.0f,1.0f//3
};
浮动顶点后退[]=
{
-0.6,-0.6f,-0.5f,//0
0.6f,-0.6f,-0.5f,//1
0.6f,0.6f,-0.5f,//2
-0.6f,0.6f,-0.5f//3
};
无符号整数索引[]=
{
0,1,3,//第一个三角形
1,2,3//第二个三角形
};
内部主(空)
{
GLFWwindow*窗口;
/*初始化库*/
如果(!glfwInit())
{

你完全搞砸了你的顶点属性ponter设置:

首先,查询名为
position
的属性,但从不使用该索引,而是使用
0

然后,查询
texCoord
,再次忽略它,启用属性数组
1
,并覆盖属性
0
的属性指针

这意味着属性
1
具有一些未定义的指针值,并且您具有未定义的行为


最有可能发生的情况是,如果您不使用纹理,您就很幸运了,因为您只有一个活动属性恰好得到位置0。而且您的GL实现似乎忽略了非活动属性的属性数组,因此不会崩溃。当您启用这两个属性时,它们很可能都是
0
1
,并且没有办法不取消对无效指针的引用。

您完全搞砸了顶点属性ponter设置:

首先,查询名为
position
的属性,但从不使用该索引,而是使用
0

然后,查询
texCoord
,再次忽略它,启用属性数组
1
,并覆盖属性
0
的属性指针

这意味着属性
1
具有一些未定义的指针值,并且您具有未定义的行为


最有可能发生的情况是,如果您不使用纹理,您就很幸运了,因为您只有一个活动属性恰好得到位置0。而且您的GL实现似乎忽略了非活动属性的属性数组,因此不会崩溃。当您启用这两个属性时,它们很可能都是
0
1
,并且没有办法不取消对无效指针的引用。

忘记将其更改回去,正在尝试查看这是否是问题所在。最初它看起来是这样的:GlenableVertexAttributeArray(posAttrib);GlenableVertexAttributeArray(texAttrib);从这段源代码中得到了这个想法:您仍然为attribute
0
设置了两次属性指针。实际上,您的代码现在甚至比以前更糟糕,因为您现在可能有两个无效的属性指针,而不仅仅是一个。这是怎么回事:
//Position layout unsigned int posAttrib=glGetAttribLocation(shader,“位置”);GlendableVertexAttribArray(posAttrib);GlendableVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*5,0);//纹理布局无符号int-texAttrib=glGetAttribLocation(着色器,“texCoord”);GlendableVertexAttribArray(TexattribTattribArray);glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*5,(void*)(3*sizeof(FLOAT));仍不使用查询的属性指示符glvertexattributepointer(posAttrib,3,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*5,0);你是说这个吗?伙计,如果可能的话,给我举个例子^^^忘了把它改回去,我想看看这是否是问题所在。最初它是这样的:glEnableVertexAttribArray(posAttrib);glEnableVertexAttribArray(texAttrib);从这段源代码中得到了这个想法:您仍然为attribute
0
设置了两次属性指针。实际上,您的代码现在甚至比以前更糟糕,因为您现在可能有两个无效的属性指针,而不仅仅是一个。这是怎么回事:
//Position layout unsigned int posAttrib=glGetAttribLocation(shader,”位置“;glEnableVertexAttribArray(posAttrib);GlenableVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*5,0);//纹理布局无符号int-texAttrib=glGetAttribLocation(着色器,“texCoord”);glEnableVertexAttribArray(texAttrib);glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*5,(void*)(3*sizeof(FLOAT));仍然没有使用查询的属性指示符glvertexattributepointer(posAttrib,3,GL_FLOAT,GL_FALSE,sizeof(FLOAT)*5,0);你是这个意思吗?如果可能的话,给我一个例子^^
   // Position layout
    unsigned int posAttrib = glGetAttribLocation(shader, "position");
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);
   // Texture layout
    unsigned int texAttrib = glGetAttribLocation(shader, "texCoord");
    glEnableVertexAttribArray(1);
    glCheckError();
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(3 * sizeof(float)));