简体   繁体   中英

Texture not showing up in OpenGL ES 2.0

Currently working in OpenGL ES 2.0 in native on iOS. For some reason, my texture quad won't render, it just won't appear. I try to load in a .bmp file for the texture, and I do know that it goes through, because the log function I put in PolygonRenderer.addTexture prints out "Image size: 256, 256" , which is the size of my texture.

Edit: My .bmp texture is saved in R8, G8, B8 form.

VertexShader:

std::string textureVertex =
    "attribute vec3 vertexloc;                                              \n"
    "attribute vec3 vertexcol;                                              \n"
    "attribute vec2 vertexuv;                                               \n"
    "varying vec2 TexCoords;                                                \n"
    "varying vec3 textColor;                                                \n"
    "uniform mat4 projection;                                               \n"
    "uniform mat4 view;                                                     \n"
    "uniform mat4 offset;                                                   \n"
    "void main()                                                            \n"
    "{                                                                      \n"
    "    gl_Position = projection * view * offset * vec4(vertexloc, 1.0);   \n"
    "    TexCoords = vertexuv;                                              \n"
    "    textColor = vertexcol;                                             \n"
    "}";

Fragment Shader:

std::string textureFragment =
    "precision mediump float;                                               \n"
    "varying vec2 TexCoords;                                                \n"
    "varying vec3 textColor;                                                \n"
    "uniform sampler2D text;                                                \n"
    "void main()                                                            \n"
    "{                                                                      \n"
    "    vec4 sampled = vec4(1.0, 1.0, 1.0, texture2D(text, TexCoords).r);  \n"
    "    gl_FragColor = vec4(textColor, 1.0) * sampled;                     \n"
    "}";

Vertices:

x = sWindowWidth / 2 - 1000 / 2;
    y = - sWindowHeight / 2 - 172 / 2;
    w = 1000;
    h = 172;
    temp = {
        x,              y + h,          0.3,
        textureColor.x,    textureColor.y,    textureColor.z,
        0, 1,

        x,              y,              0.3,
        textureColor.x,    textureColor.y,    textureColor.z,
        0, 0,

        x + w,          y,              0.3,
        textureColor.x,    textureColor.y,    textureColor.z,
        1, 0,

        x,              y + h,          0.3,
        textureColor.x,    textureColor.y,    textureColor.z,
        0, 1,

        x + w,          y,              0.3,
        textureColor.x,    textureColor.y,    textureColor.z,
        1, 0,

        x + w,          y + h,          0.3,
        textureColor.x,    textureColor.y,    textureColor.z,
        1, 1
    };
    polygonRenderer.addLoadingPolygon(temp);

PolygonRenderer excerpts:

AddLoadingPolygon:

void PolygonRenderer::addLoadingPolygon(std::vector<GLfloat> vertices) {
    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat),
        vertices.data(), GL_STATIC_DRAW);
    if(vertexBuffer == 0){
        log("gl vertexBuffer not generated");
    }
    loadingPolygons.push_back(PolygonRenderObject{
        vertexBuffer,
        (long)vertices.size() / 8,
        0
    });
}

AddTexture:

void PolygonRenderer::addTexture(const char* imagePath) {
    // Data read from the header of the BMP file
    unsigned char header[54]; // Each BMP file begins by a 54-bytes header
    unsigned int dataPos;     // Position in the file where the actual data begins
    unsigned int width, height;
    unsigned int imageSize;   // = width*height*3
    // Actual RGB data
    unsigned char * data;
    // Open the file
    FILE * file = fopen(imagePath,"rb");
    if (!file) {
        log("Image could not be opened\n");
        return;
    }
    if (fread(header, 1, 54, file) != 54) {
        log("Not a correct BMP file");
        return;
    }
    if (header[0] != 'B' || header[1] != 'M') {
        log("Not a correct BMP file");
        return;
    }
    // Read ints from the byte array
    dataPos     = *(int*)&(header[0x0A]);
    imageSize   = *(int*)&(header[0x22]);
    width       = *(int*)&(header[0x12]);
    height      = *(int*)&(header[0x16]);

    if (imageSize == 0) {
        imageSize = width * height;
    }
    log("Image size: %d, %d", width, height);
    if (dataPos == 0) {
        dataPos = 54;
    }

    data = new unsigned char[imageSize];
    fread(data, 1, imageSize, file);
    fclose(file);

    glActiveTexture(GL_TEXTURE0);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    GLuint textureId;
    glGenTextures(1, &textureId);
    glBindTexture(GL_TEXTURE_2D, textureId);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB,
        GL_UNSIGNED_BYTE, data);

    checkForGLError("Add texture:");
    log("Texture created: %d", textureId);
    textures.push_back(textureId);
}

Render for this part:

glUseProgram(shader.get(1));
        glBindAttribLocation(shader.get(1), 2, "vertexloc");
        glBindAttribLocation(shader.get(1), 3, "vertexcol");
        glBindAttribLocation(shader.get(1), 4, "vertexuv");

        glBindTexture(GL_TEXTURE_2D, textures[0]);

        glEnableVertexAttribArray(2);
        glEnableVertexAttribArray(3);
        glEnableVertexAttribArray(4);

        glUniformMatrix4fv(viewLocation, 1, GL_FALSE,
            &frame.combinedMatrix[16 * objects[1].ViewGroup]);

        glBindBuffer(GL_ARRAY_BUFFER, objects[1].Buffer);
        glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat),
            0);

        glBindBuffer(GL_ARRAY_BUFFER, objects[1].Buffer);
        glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat),
                              (GLvoid*)(3 * sizeof(GLfloat)));

        glBindBuffer(GL_ARRAY_BUFFER, objects[1].Buffer);
        glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat),
                              (GLvoid*)(6 * sizeof(GLfloat)));

        checkForGLError("In Renderer");
        glDrawArrays(GL_TRIANGLES, 0, 6);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glDisableVertexAttribArray(2);
        glDisableVertexAttribArray(3);
        glDisableVertexAttribArray(4);

不幸的是,这仅仅是我没有为值分配统一值,这导致所有顶点都变为(0,0)(或类似的东西)。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM