【问题标题】:Texture not showing up in OpenGL ES 2.0纹理未在 OpenGL ES 2.0 中显示
【发布时间】:2016-08-12 00:57:27
【问题描述】:

目前在 iOS 上使用原生的 OpenGL ES 2.0。出于某种原因,我的纹理四边形不会渲染,只是不会出现。我尝试为纹理加载一个 .bmp 文件,我确实知道它通过了,因为我放入 PolygonRenderer.addTexture 的日志函数会打印出 "Image size: 256, 256",这是我的纹理大小。

编辑:我的.bmp 纹理以 R8、G8、B8 形式保存。

顶点着色器:

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"
    "}";

片段着色器:

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"
    "}";

顶点:

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 摘录:

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

添加纹理:

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

为此部分渲染:

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

【问题讨论】:

  • 它是否呈现无纹理?我没有查看所有代码,但一个明显的问题是您调用glBindAttribLocation() 太晚了。这需要链接程序之前发生。
  • 哦,真的吗?谢谢。我会试试看。
  • 不幸的是,仍然存在问题,但如果我切换到其他着色器并注释掉第三个属性,则会出现该框。至于有一个空白纹理,我认为不会发生这种情况,因为它可以正确加载图像,尽管我不太确定如何检查纹理是否正确创建。

标签: c++ ios opengl-es textures


【解决方案1】:

不幸的是,这只是我没有将统一分配给一个值,这导致所有顶点都转到 (0,0)(或类似的东西)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多