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中使用多个纹理修复此问题_C++_Opengl_Glfw - Fatal编程技术网

C++ 如何在Opengl中使用多个纹理修复此问题

C++ 如何在Opengl中使用多个纹理修复此问题,c++,opengl,glfw,C++,Opengl,Glfw,我想发送多个纹理到片段着色器,然后在那里混合它们。 但由于某些原因,当我运行此代码时,仅显示texture2;我还看到了texure2 我的片段着色器: static const char* fragmentShaderSource = "\n\ #version 150 core\n\ in vec2 Texcoord;\n\ uniform sampler2D tex0;\n\ uniform sampler2D tex1;\n\ out ve

我想发送多个纹理到片段着色器,然后在那里混合它们。 但由于某些原因,当我运行此代码时,仅显示texture2;我还看到了texure2

我的片段着色器:

    static const char* fragmentShaderSource = "\n\
    #version 150 core\n\
    in vec2 Texcoord;\n\
    uniform sampler2D tex0;\n\
    uniform sampler2D tex1;\n\
    out vec4 color;\n\
    void main(){\n\
        vec4 color1=texture(tex0,Texcoord);\n\
        vec4 color2=texture(tex1,Texcoord);\n\
        color=mix(color1,color2,0.5);\n\
        //color=color1;\n\
    }\n\
    ";
我的多重纹理代码:

    GLuint textures[2];
    glGenTextures(2, textures);
    int width, height;
    unsigned char* image;

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE0, textures[0]);
    image = SOIL_load_image("1.png", &width, &height, 0, SOIL_LOAD_RGBA);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glGenerateMipmap(GL_TEXTURE_2D);
    glUniform1i(glGetUniformLocation(program, "tex0"), 0);
    SOIL_free_image_data(image);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE1, textures[1]);
    image = SOIL_load_image("2.png", &width, &height, 0, SOIL_LOAD_RGBA);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glGenerateMipmap(GL_TEXTURE_2D);
    glUniform1i(glGetUniformLocation(program, "tex1"), 1);
    SOIL_free_image_data(image);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
这是我的窗口循环:

    while (!glfwWindowShouldClose(window)) {
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        if (glfwGetKey(window, GLFW_KEY_E)) {
            break;
        }
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
如果需要,这是我的全部代码:

#define GLEW_STATIC
#include<gl\glew.h>
#include<GLFW\glfw3.h>
#include<iostream>
#include<SOIL.h>
//////////////////////////////////////
static const char* vertexShaderSource = "\n\
    #version 150 core\n\
    in vec2 position;\n\
    in vec3 inColor;\n\
    in vec2 texcoord;\n\
    out vec2 Texcoord;\n\
    out vec3 Color;                                                              

    void main(){\n\
        Color=inColor;\n\
        Texcoord=texcoord;\n\
        gl_Position=vec4(position,0,1);\n\
    }\n";

static const char* fragmentShaderSource = "\n\
    #version 150 core\n\
    //uniform vec4 fragmentColor;\n\
    in vec3 Color;\n\
    in vec2 Texcoord;\n\
    uniform sampler2D tex0;\n\
    uniform sampler2D tex1;\n\
    out vec4 color;\n\
    void main(){\n\
        vec4 color1=texture(tex0,Texcoord);\n\
        vec4 color2=texture(tex1,Texcoord);\n\
        color=mix(color1,color2,0.5);\n\
        //color=color1;\n\
    }\n\
    ";
//////////////////////////////////////


int main() {
    if (!glfwInit())
        return -1;

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    GLFWwindow* window = glfwCreateWindow(1024, 620, "Window", nullptr, nullptr);


    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;


    if (glewInit() != GLEW_OK)
        return -1;

    GLfloat triangleVertices[] = {
        0.5f,0.5f,1,0,0,1,0,
        0.5f,-0.5f,0,1,0,1,1,
        -0.5f,-0.5f,0,0,1,0,1,
        -0.5f,0.5f,0,0,0,0,0
    };

    GLuint vao; 
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices), triangleVertices, GL_STATIC_DRAW);

    GLuint elements[] = { 0,1,2 ,3,0,2};
    GLuint ebo;
    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);

    ////////////////////////////////////////////////////////
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);
    glCompileShader(vertexShader);
    GLint statusVertex;
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &statusVertex);
    if (!statusVertex) {
        char buffer[1024];
        glGetShaderInfoLog(vertexShader, 1024, NULL, buffer);
        std::cout << "Error Compiling vertexShader:" << buffer << std::endl;
    }



    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);
    glCompileShader(fragmentShader);
    GLint statusFrag;
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &statusFrag);
    if (!statusFrag) {
        char buffer[1024];
        glGetShaderInfoLog(fragmentShader, 1024, NULL, buffer);
        std::cout << "Error Compiling fragmentShader:" << buffer << std::endl;
    }

    GLuint program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glBindFragDataLocation(program, 0, "color");
    glLinkProgram(program);//making connection
    glUseProgram(program);
    //////////////////////////////////////////////////////////






    GLint positionAttrib = glGetAttribLocation(program, "position");
    glVertexAttribPointer(positionAttrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), nullptr);
    glEnableVertexAttribArray(positionAttrib);

    GLint colorAttrib = glGetAttribLocation(program, "inColor");
    glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(2 * sizeof(GL_FLOAT)));
    glEnableVertexAttribArray(colorAttrib);

    GLint texAttrib = glGetAttribLocation(program, "texcoord");
    glVertexAttribPointer(texAttrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(5 * sizeof(GL_FLOAT)));
    glEnableVertexAttribArray(texAttrib);

    GLuint textures[2];
    glGenTextures(2, textures);
    int width, height;
    unsigned char* image;

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE0, textures[0]);
    image = SOIL_load_image("1.png", &width, &height, 0, SOIL_LOAD_RGBA);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glGenerateMipmap(GL_TEXTURE_2D);
    glUniform1i(glGetUniformLocation(program, "tex0"), 0);
    SOIL_free_image_data(image);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE1, textures[1]);
    image = SOIL_load_image("2.png", &width, &height, 0, SOIL_LOAD_RGBA);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glGenerateMipmap(GL_TEXTURE_2D);
    glUniform1i(glGetUniformLocation(program, "tex1"), 1);
    SOIL_free_image_data(image);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


    /////////////////////////////////////////////////////////////
    while (!glfwWindowShouldClose(window)) {
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        //glDrawArrays(GL_TRIANGLES, 0, 3);

        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        if (glfwGetKey(window, GLFW_KEY_E)) {
            break;
        }
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;
}
#定义GLEW#U静态
#包括
#包括
#包括
#包括
//////////////////////////////////////
静态常量char*vertexShaderSource=“\n\
#版本150核心\n\
在vec2位置;\n\
在vec3中不着色;\n\
在vec2 texcoord中;\n\
out vec2 Texcoord;\n\
输出vec3颜色;
void main(){\n\
颜色=不着色;\n\
Texcoord=Texcoord;\n\
gl_位置=向量4(位置,0,1);\n\
}\n”;
静态常量char*fragmentShaderSource=“\n\
#版本150核心\n\
//统一的vec4碎片颜色;\n\
以vec3颜色显示;\n\
在vec2 Texcoord中;\n\
统一采样器2D tex0;\n\
统一采样器2D tex1;\n\
输出vec4颜色;\n\
void main(){\n\
vec4 color1=纹理(tex0,Texcoord);\n\
vec4 color2=纹理(tex1,Texcoord);\n\
颜色=混合(颜色1,颜色2,0.5);\n\
//颜色=颜色1;\n\
}\n\
";
//////////////////////////////////////
int main(){
如果(!glfwInit())
返回-1;
glfwWindowHint(GLFW_上下文_版本_专业,3);
glfwWindowHint(GLFW_上下文_版本_小调,2);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
GLFWwindow*window=glfwCreateWindow(1024620,“窗口”,nullptr,nullptr);
glfwMakeContextCurrent(窗口);
glewExperimental=GL_TRUE;
如果(glewInit()!=GLEW\u确定)
返回-1;
GLfloat三角形杠杆[]={
0.5f,0.5f,1,0,0,1,0,
0.5f,-0.5f,0,1,0,1,1,
-0.5f,-0.5f,0,0,1,0,1,
-0.5f,0.5f,0,0,0,0,0
};
GLuint-vao;
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1,&vbo);
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GL_数组_缓冲区、sizeof(TriangalLevertices)、TriangalLevertices、GL_静态_绘图);
GLuint元素[]={0,1,2,3,0,2};
胶合ebo;
glGenBuffers(1和ebo);
glBindBuffer(GLU元素数组缓冲区,ebo);
glBufferData(GL_元素\数组\缓冲区、sizeof(元素)、元素、GL_静态\绘图);
////////////////////////////////////////////////////////
GLuint vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1和vertexShaderSource,nullptr);
glCompileShader(顶点着色器);
闪烁状态顶点;
glGetShaderiv(顶点着色器、GL_编译_状态和状态顶点);
如果(!statusVertex){
字符缓冲区[1024];
glGetShaderInfoLog(顶点着色器,1024,NULL,缓冲区);

std::cout
glBindTexture
获取纹理目标而不是单元

目标是:GL_纹理_1D、GL_纹理_2D、GL_纹理_3D、GL_纹理_立方体_贴图、GL_纹理_1D_数组、GL_纹理_2D_数组(和扩展特定目标)

纹理单元被传递到
glActiveTexture
,它们是GL_TEXTURE0、GL_TEXTURE1等,也是采样器均匀设置的对象


将代码更改为

    glActiveTexture(GL_TEXTURE0);
--- glBindTexture(GL_TEXTURE_2D, textures[0]);
+++ glBindTexture(GL_TEXTURE_2D, textures[0]);


正如rabbit所说,完整的代码示例与上面的代码示例不匹配。是te0还是tex0?谢谢Rabbid。这是因为GL_TEXTURE_2D。但是你能告诉我为什么它在第一个位置工作,为什么第二个纹理(不是第一个)工作吗即使两个都有错误也显示谢谢你的回答。你能告诉我为什么第二个纹理即使两个都有错误也不显示第一个吗。@Abhishek:因为
glBindTexture
不接受纹理单位标记,当你用单位标记调用它时,这些调用没有效果,也就是说,你没有更改纹理nding。在不更改目标绑定的情况下,所有纹理单元都将使用(相同的目标)默认绑定。因此,第二个纹理图像上载将覆盖上载的第一个纹理(都在默认目标上),并因此显示在两个纹理单元中。
    glActiveTexture(GL_TEXTURE1);
--- glBindTexture(GL_TEXTURE_2D, textures[1]);
+++ glBindTexture(GL_TEXTURE_2D, textures[1]);