在iOS中使用OpenGL ES 2,我有一个纹理,可以在多个层中使用。我现在想要在其中一个图层中稍微改变它,而不复制纹理本身。
我最初使用my_texture_data中的数据创建纹理。这很好。
GLuint lTexId;
glGenTextures(1, &lTexId);
glBindTexture(GL_TEXTURE_2D, lTexId);
// use linear filtering
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_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, my_texture_data);
glBindTexture(GL_TEXTURE_2D, 0);
我想在其中一个图层中使用最近邻居样本。是否可以(如果是这样,如何)简单地在绘制调用之间切换过滤模式?我尝试添加这个,就在绘制每个对象的绘制调用之前
/* Excerpt from common code block used to render texture in all layers */
/* NEW CODE BLOCK */
if (use_nearest) {
glActiveTexture(GL_TEXTURE2);
GLuint tex_id = getTextureId(); // a function to get original texture ID
glBindTexture(GL_TEXTURE_2D, tex_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLuint lastError = glGetError();
if (lastError != 0) {
printf("GLERROR: %i", lastError);
}
glBindTexture(GL_TEXTURE_2D, 0);
}
else {
glActiveTexture(GL_TEXTURE2);
GLuint tex_id = getTextureId(); // a function to get original texture ID
glBindTexture(GL_TEXTURE_2D, tex_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
GLuint lastError = glGetError();
if (lastError != 0) {
printf("GLERROR: %i", lastError);
}
glBindTexture(GL_TEXTURE_2D, 0);
}
/* END NEW CODE */
glDrawElements(GL_TRIANGLE_STRIP, _IndexCount, GL_UNSIGNED_SHORT, 0);
尝试的解决方案无效。没有GL错误,但过滤模式在创建纹理时保持原始设置。
我在OpenGL: Reusing the same texture with different parameters中看到了一个潜在的答案,但是现在我需要一个不需要代码重构的快速解决方案。
该答案中的评论表明“你可以在需要的时候更改纹理参数” - 我似乎没有正确地做到这一点。
有关如何更改参数/我做错了什么的任何建议?