android - OpenGL ES 3.0。浮点纹理

标签 android c++ opengl-es

我有 OpenGL ES 3.0,我正在尝试创建纹理:

case 1: glTexImage2D(GL_TEXTURE_2D, 0, GL_R16F, width, height, 0, GL_RED, GL_HALF_FLOAT, 0); break;
case 2: glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, width, height, 0, GL_RG, GL_HALF_FLOAT, 0); break;
case 3: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_HALF_FLOAT, 0); break;

(对于这段代码 glGetError() 返回 0)

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureHandle, 0);

但是当附加到帧缓冲区时,glCheckFramebufferStatus(GL_FRAMEBUFFER) 返回 36054。

Surface CreateSurface(GLsizei width, GLsizei height, int numComponents)
{
 GLuint fboHandle;
 glGenFramebuffers(1, &fboHandle);
 glBindFramebuffer(GL_FRAMEBUFFER, fboHandle);

 GLuint textureHandle;
 glGenTextures(1, &textureHandle);
 glBindTexture(GL_TEXTURE_2D, textureHandle);
 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);

 switch (numComponents) {
        case 1: glTexImage2D(GL_TEXTURE_2D, 0, GL_R16F, width, height, 0, GL_RED, GL_HALF_FLOAT, 0); break;
        case 2: glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, width, height, 0, GL_RG, GL_HALF_FLOAT, 0); break;
        case 3: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_HALF_FLOAT, 0); break;
        default: PezFatalError("Illegal slab format.");
    }


 PezCheckCondition(GL_NO_ERROR == glGetError(), "Unable to create normals texture");

 GLuint colorbuffer;
 glGenRenderbuffers(1, &colorbuffer);
 glBindRenderbuffer(GL_RENDERBUFFER, colorbuffer);
 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureHandle, 0);
 PezCheckCondition(GL_NO_ERROR == glGetError(), "Unable to attach color buffer");

 PezCheckCondition(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER), "Unable to create FBO.");
 Surface surface = { fboHandle, textureHandle, numComponents };

 glClearColor(0, 0, 0, 0);
 glClear(GL_COLOR_BUFFER_BIT);
 glBindFramebuffer(GL_FRAMEBUFFER, 0);

 return surface;
}

我做错了什么?

最佳答案

附加到 GL_COLOR_ATTACHMENTn 的纹理需要使用颜色可渲染格式。不幸的是,浮点格式不可渲染。有关可渲染颜色格式的列表,请查看 http://www.khronos.org/registry/gles/specs/3.0/es_spec_3.0.2.pdf 中的表 3.12

关于android - OpenGL ES 3.0。浮点纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19376095/

相关文章:

安卓。 LDPI、MDPI、HDPI 说明

android - 在不重新创建 Activity 的情况下更改应用程序主题

android - 从启动器调用 Activity 和/或服务

android - 如何以编程方式打开或模拟对使用 XML 创建的 android 首选项的单击?

c++ - C++中RTTI的使用

ios - glclear() 在 ios8 opengl 中修改 glscissor() 边界之外的图像

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 按照运行时定义的顺序遍历 C++ 元组

opengl-es - 具有白色轮廓的 OpenGL 彩色位图字体

c++ - 我的矩阵堆栈实现 (OpenGL ES 2.0) 有什么问题?