gpt4 book ai didi

swift - 绘制到帧缓冲区纹理时出现问题。它绘制空白

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:44 25 4
gpt4 key购买 nike

我在 OpenGL es 2.0 中使用 glKit 尝试渲染到 iOS 设备。

基本上我的目标是绘制到纹理而不是绘制到主缓冲区。然后将该纹理渲染到屏幕上。我一直在努力关注another topic on so .不幸的是,他们提到了一些关于二的力量的事情(我假设关于分辨率)但我不知道如何解决它。无论如何,这是我对该主题的代码的快速解释。

import Foundation
import GLKit
import OpenGLES

class RenderTexture {
var framebuffer:GLuint = 0
var tex:GLuint = 0
var old_fbo:GLint = 0

init(width: GLsizei, height: GLsizei)
{
glGetIntegerv(GLenum(GL_FRAMEBUFFER_BINDING), &old_fbo)

glGenFramebuffers(1, &framebuffer)
glGenTextures(1, &tex)

glBindFramebuffer(GLenum(GL_FRAMEBUFFER), framebuffer)
glBindTexture(GLenum(GL_TEXTURE_2D), tex)
glTexImage2D(GLenum(GL_TEXTURE_2D), 0, GL_RGBA, GLsizei(width), GLsizei(height), 0, GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), nil)
glFramebufferTexture2D(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_TEXTURE_2D), tex, 0)

glClearColor(0, 0.1, 0, 1)
glClear(GLenum(GL_COLOR_BUFFER_BIT))

let status = glCheckFramebufferStatus(GLenum(GL_FRAMEBUFFER))
if (status != GLenum(GL_FRAMEBUFFER_COMPLETE))
{
print("DIDNT GO WELL WITH", width, " " , height)
print(status)
}

glBindFramebuffer(GLenum(GL_FRAMEBUFFER), GLenum(old_fbo))
}

func begin()
{
glGetIntegerv(GLenum(GL_FRAMEBUFFER_BINDING), &old_fbo)
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), framebuffer)
}

func end()
{
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), GLenum(old_fbo))
}
}

那么就渲染而言,我还有一些事情要做。

理论上可以全屏渲染任何纹理的代码。这已经用两个手动加载的 png(不使用缓冲区更改)进行了测试并且效果很好。

func drawTriangle(texture: GLuint)
{
loadBuffers()
//glViewport(0, 0, width, height)
//glClearColor(0, 0.0, 0, 1.0)
//glClear(GLbitfield(GL_COLOR_BUFFER_BIT) | GLbitfield(GL_DEPTH_BUFFER_BIT))


glEnable(GLenum(GL_TEXTURE_2D))
glActiveTexture(GLenum(GL_TEXTURE0))

glUseProgram(texShader)
let loc1 = glGetUniformLocation(texShader, "s_texture")
glUniform1i(loc1, 0)


let loc3 = glGetUniformLocation(texShader, "matrix")
if (loc3 != -1)
{
glUniformMatrix4fv(loc3, 1, GLboolean(GL_FALSE), &matrix)
}

glBindTexture(GLenum(GL_TEXTURE_2D), texture)
glDrawArrays(GLenum(GL_TRIANGLE_STRIP), 0, 6)
glDisable(GLenum(GL_TEXTURE_2D))

destroyBuffers()
}

我还有一个在屏幕上绘制几个点的功能。您真的不需要查看这些方法,但它确实有效。这就是我要知道 OpenGL 是从缓冲区纹理而不是预加载纹理绘制的方式。

最后,这是我正在尝试执行的代码的要点。

func initialize()
{
nfbo = RenderTexture(width: width, height: height)
}

fun draw()
{
glViewport(0, 0, GLsizei(width * 2), GLsizei(height * 2)) //why do I have to multiply for 2 to get it to work?????
nfbo.begin()
drawDots() //Draws the dots
nfbo.end()
reset()
drawTriangle(nfbo.tex)
}

在所有这一切结束时,所绘制的只是一个空白屏幕。如果还有更多代码可以帮助您解决问题,请告诉我。我试图修剪它以减少它对您的烦扰。

注意:考虑到两个事物的整体力量,我尝试通过 fbo 类 512 x 512 以防万一它会使事情成为两个的力量。不幸的是它没有那样做。

另一个注意事项:我所做的只是 2D,所以我不需要深度缓冲区,对吧?

最佳答案

昨天我看到了完全相同的问题。

经过几个小时的努力,我找到了原因。

诀窍是使用以下配置您的纹理贴图:

    glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_S), GL_CLAMP_TO_EDGE);
glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_T), GL_CLAMP_TO_EDGE);

否则,您将不会在纹理贴图上绘制任何东西。

原因似乎是虽然 ios 支持不是 2 的幂的纹理映射。它需要 GL_CLAMP_TO_EDGE。否则它不会工作。

它真的应该报告不完整的帧缓冲区。我花了很长时间来调试这个问题!

这里有一个相关的讨论:

Rendering to non-power-of-two texture on iPhone

关于swift - 绘制到帧缓冲区纹理时出现问题。它绘制空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34349038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com