Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.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
Ios 解除打开的GL ES纹理绑定的正确方法?_Ios_C_Opengl Es_Textures_Opengl Es 2.0 - Fatal编程技术网

Ios 解除打开的GL ES纹理绑定的正确方法?

Ios 解除打开的GL ES纹理绑定的正确方法?,ios,c,opengl-es,textures,opengl-es-2.0,Ios,C,Opengl Es,Textures,Opengl Es 2.0,我有一个绘图代码,它首先在没有纹理的情况下绘制背景,然后在上面覆盖纹理。我目前正在使用glBindTexture(GL\u TEXTURE\u 2D,0),以便在执行第二批绘图后取消绑定纹理 但是,当我分析Xcode中的GPU性能时,这会产生以下警告: 当我删除代码以取消绑定纹理时,警告消失,但没有正确绘制。我正在绘制的纹理没有启用mipmapping,因此它不是从那里生成的 图纸代码: glClear(GL_COLOR_BUFFER_BIT); { // Drawing glVi

我有一个绘图代码,它首先在没有纹理的情况下绘制背景,然后在上面覆盖纹理。我目前正在使用
glBindTexture(GL\u TEXTURE\u 2D,0)
,以便在执行第二批绘图后取消绑定纹理

但是,当我分析Xcode中的GPU性能时,这会产生以下警告:

当我删除代码以取消绑定纹理时,警告消失,但没有正确绘制。我正在绘制的纹理没有启用mipmapping,因此它不是从那里生成的

图纸代码:

glClear(GL_COLOR_BUFFER_BIT);

{ // Drawing

    glViewport(0, 0, frameWidth, frameHeight);

    GLuint vertexCount = animBuffer.vertexCounts[animIndex];

    glBindBuffer(GL_ARRAY_BUFFER, animBuffer.vertexBuffers[animIndex]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, animBuffer.indexBuffers[animIndex]);

    glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), 0);
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*3));
    glVertexAttribPointer(textureCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*7));

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0);


    // glEnable(GL_TEXTURE_2D) (tried this, gives another warning)

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(textureUniform, 0);

    glBindBuffer(GL_ARRAY_BUFFER, textureColorBuffer); // Transparent color buffer to allow texture to be overlayed.
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(float)*3));

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0);

    // Unbind texture.... this line is causing the error.
    glBindTexture(GL_TEXTURE_2D, 0);

    // glDisable(GL_TEXTURE_2D) (tried this, gives another warning)    
}

[context presentRenderbuffer:GL_RENDERBUFFER];
CGImageRef textureImage = image.CGImage;

size_t width = CGImageGetWidth(textureImage);
size_t height = CGImageGetHeight(textureImage);

GLubyte* spriteData = malloc(width*height*4);

CGColorSpaceRef cs = CGImageGetColorSpace(textureImage);
CGContextRef c = CGBitmapContextCreate(spriteData, width, height, 8, width*4, cs, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(cs);

CGContextScaleCTM(c, 1, -1);
CGContextTranslateCTM(c, 0, -CGContextGetClipBoundingBox(c).size.height);

CGContextDrawImage(c, (CGRect){CGPointZero, {width, height}}, textureImage);
CGContextRelease(c);

GLuint glTex;
glGenTextures(1, &glTex);
glBindTexture(GL_TEXTURE_2D, glTex);

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


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

glBindTexture(GL_TEXTURE_2D, 0);

free(spriteData);

return glTex;
纹理加载代码:

glClear(GL_COLOR_BUFFER_BIT);

{ // Drawing

    glViewport(0, 0, frameWidth, frameHeight);

    GLuint vertexCount = animBuffer.vertexCounts[animIndex];

    glBindBuffer(GL_ARRAY_BUFFER, animBuffer.vertexBuffers[animIndex]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, animBuffer.indexBuffers[animIndex]);

    glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), 0);
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*3));
    glVertexAttribPointer(textureCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*7));

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0);


    // glEnable(GL_TEXTURE_2D) (tried this, gives another warning)

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(textureUniform, 0);

    glBindBuffer(GL_ARRAY_BUFFER, textureColorBuffer); // Transparent color buffer to allow texture to be overlayed.
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(float)*3));

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0);

    // Unbind texture.... this line is causing the error.
    glBindTexture(GL_TEXTURE_2D, 0);

    // glDisable(GL_TEXTURE_2D) (tried this, gives another warning)    
}

[context presentRenderbuffer:GL_RENDERBUFFER];
CGImageRef textureImage = image.CGImage;

size_t width = CGImageGetWidth(textureImage);
size_t height = CGImageGetHeight(textureImage);

GLubyte* spriteData = malloc(width*height*4);

CGColorSpaceRef cs = CGImageGetColorSpace(textureImage);
CGContextRef c = CGBitmapContextCreate(spriteData, width, height, 8, width*4, cs, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(cs);

CGContextScaleCTM(c, 1, -1);
CGContextTranslateCTM(c, 0, -CGContextGetClipBoundingBox(c).size.height);

CGContextDrawImage(c, (CGRect){CGPointZero, {width, height}}, textureImage);
CGContextRelease(c);

GLuint glTex;
glGenTextures(1, &glTex);
glBindTexture(GL_TEXTURE_2D, glTex);

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


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

glBindTexture(GL_TEXTURE_2D, 0);

free(spriteData);

return glTex;
如何取消绑定纹理以删除此警告

编辑:

glClear(GL_COLOR_BUFFER_BIT);

{ // Drawing

    glViewport(0, 0, frameWidth, frameHeight);

    GLuint vertexCount = animBuffer.vertexCounts[animIndex];

    glBindBuffer(GL_ARRAY_BUFFER, animBuffer.vertexBuffers[animIndex]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, animBuffer.indexBuffers[animIndex]);

    glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), 0);
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*3));
    glVertexAttribPointer(textureCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*7));

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0);


    // glEnable(GL_TEXTURE_2D) (tried this, gives another warning)

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(textureUniform, 0);

    glBindBuffer(GL_ARRAY_BUFFER, textureColorBuffer); // Transparent color buffer to allow texture to be overlayed.
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(float)*3));

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0);

    // Unbind texture.... this line is causing the error.
    glBindTexture(GL_TEXTURE_2D, 0);

    // glDisable(GL_TEXTURE_2D) (tried this, gives another warning)    
}

[context presentRenderbuffer:GL_RENDERBUFFER];
CGImageRef textureImage = image.CGImage;

size_t width = CGImageGetWidth(textureImage);
size_t height = CGImageGetHeight(textureImage);

GLubyte* spriteData = malloc(width*height*4);

CGColorSpaceRef cs = CGImageGetColorSpace(textureImage);
CGContextRef c = CGBitmapContextCreate(spriteData, width, height, 8, width*4, cs, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(cs);

CGContextScaleCTM(c, 1, -1);
CGContextTranslateCTM(c, 0, -CGContextGetClipBoundingBox(c).size.height);

CGContextDrawImage(c, (CGRect){CGPointZero, {width, height}}, textureImage);
CGContextRelease(c);

GLuint glTex;
glGenTextures(1, &glTex);
glBindTexture(GL_TEXTURE_2D, glTex);

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


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

glBindTexture(GL_TEXTURE_2D, 0);

free(spriteData);

return glTex;
我曾尝试在纹理图形之前和之后使用
glEnable(GL_TEXTURE_2D)
glDisable(GL_TEXTURE_2D)
,尽管这现在给了我以下警告:


我认为避免此警告的最简单方法是保持纹理绑定,但只需向片段着色器发送一个
统一的
,指示是否混合纹理

因此,在绘制之前,只需添加:

glUniform1i(drawTexInput, GL_FALSE); // Or GL_TRUE to draw.
在片段着色器中:

varying lowp vec4 destinationColor;

uniform bool drawTex;
varying lowp vec2 texCoordOut;
uniform sampler2D tex;

void main() {

    lowp vec4 result;
    if (drawTex) {
        lowp vec4 tex2D = texture2D(tex, texCoordOut);
        result = tex2D + vec4(1.0 - tex2D.a) * destinationColor; // Alpha blending
    } else {
        result = destinationColor;
    }

    gl_FragColor = result;
}

如果您通过
glTexParameter
将每个未mipmapped纹理的
GL\u纹理\u最大LOD
明确设置为0,则此警告可能消失。找不到该参数
GL\u纹理\u最大LOD
。。。它在ES2.0中被弃用了吗?对不起,我的错<代码>GL_纹理\u最大\u LOD在ES中不可用。我不认为0用于解除纹理绑定。如果我没记错的话,0实际上是一个有效的纹理。我也不记得像“解开纹理”这样的事情。可以使用glDisable(GL_纹理_2D)禁用纹理。我仍然认为没有理由在高于1.x的版本中禁用或解除绑定纹理。您尝试这样做的原因是什么?您可以发布纹理初始化代码吗?