OpenGL ES 3.0. 浮点纹理

6

我拥有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;
}

我做错了什么?
1个回答

3

谢谢!但也许我可以以某种方式获取浮点纹理? - user2881543
尝试在case 3中使用GL_RGBA16F代替GL_RGB16F - Srđan Tot
但在这种情况下,我将再次得到相同的不可渲染颜色纹理。也许我可以在着色器中以某种方式转换值,或者以其他方式解决? - user2881543
1
一个扩展可能会出现,使得浮点图像格式支持颜色渲染,而GLES 3.0规范将永远不会提到这一点。在GLES 2.0中也是这样,没有任何有用的图像格式支持颜色渲染,但很多人仍然使用它们,甚至没有检查硬件是否支持适当的扩展:P - Andon M. Coleman
2
Andon M. Coleman,如果我的设备支持扩展EXT_color_buffer_float,那么代码就可以完美运行,但事实并非如此。 - user2881543
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接