- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
OpenGL 中 glframebuffertexture 和 glbindtexture 这两个函数在使用上的具体区别是什么。
具体来说,我正在使用 OpenTK 使用 OpenGL 为嵌入式机器编写自定义轻量级 UI,它为 UI 中的不同组件使用大量帧缓冲区和各自的纹理。在内部,使用堆栈跟踪帧缓冲区,因为缓冲区内容可以绘制到“父”缓冲区(或者如果没有父缓冲区,则屏幕空间)。
我很难尝试以正确的顺序进行调用,我想知道我是否对何时需要将纹理绑定(bind)到帧缓冲区以及何时需要将纹理分配给帧缓冲区感到困惑。
我已经阅读了有关这些函数的文档,但它们并没有真正解释这些函数与帧缓冲区上下文中的关系。
我基本上没有将任何东西渲染回屏幕。
例如,如果我使用 SharpFont(FreeType 绑定(bind)库)渲染文本,我有一个用于整个渲染字符串的帧缓冲区和一个用于渲染每个字符的帧缓冲区。
这是我认为在这个例子中调用的一般顺序
从 FB0(屏幕空间)开始,
创建 FB 1,
使用 TX 1(创建然后绑定(bind)到然后附加)设置 FB 1(绑定(bind)到 FB 1),
绑定(bind)回FB0,
绑定(bind)到 FB1(开始渲染),
创建FB2,
使用 TX 2(创建然后绑定(bind)到然后附加)设置 FB 2(绑定(bind)到 FB 2),(包括渲染的字符像素数据),
绑定(bind)回FB1,
绑定(bind)TX2
使用四边形渲染 TX2(据说)
在 7 重复下一个字符,直到结束
绑定(bind)回 FB0
使用四边形渲染 TX1(据说)。
帧缓冲区(UI 对象)
public class OGLFrameBuffer : IFrameBuffer {
private int frameBufferId = -1;
private int frameBufferTexture = -1;
private IDrawer ctx;
public OGLFrameBuffer(IDrawer dCtx) { ctx = dCtx; }
public void SetupFrameBuffer(float width, float height) {
//Generate Frame Buffer if not exists;
if (frameBufferId == -1) {
frameBufferId = GL.GenFramebuffer();
}
//set current frame buffer
ctx.PushUseFrameBuffer(this, new Size((int)Math.Ceiling(width), (int)Math.Ceiling(height)));
if (frameBufferTexture != -1)
GL.DeleteTexture(frameBufferTexture);
//Generate Texture with buffer size;
frameBufferTexture = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, frameBufferTexture);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)Math.Ceiling(width), (int)Math.Ceiling(height), 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, frameBufferTexture, 0);
//return to previous buffer
ctx.PopFrameBuffer();
}
public void SetupFrameBuffer(float width, float height, byte[] data, VIPixelFormat pixelFormat) {
PixelFormat oglPixFmt;
switch (pixelFormat) {
case VIPixelFormat.VIPF_RGBA:
oglPixFmt = PixelFormat.Bgra;
break;
case VIPixelFormat.VIPF_GREYSCALE:
oglPixFmt = PixelFormat.Red;
break;
case VIPixelFormat.VIPF_RGB:
default:
oglPixFmt = PixelFormat.Bgr;
break;
}
//Generate Frame Buffer if not exists;
if (frameBufferId == -1) {
frameBufferId = GL.GenFramebuffer();
}
//set current frame buffer
ctx.PushUseFrameBuffer(this, new Size((int)Math.Ceiling(width), (int)Math.Ceiling(height)));
if (frameBufferTexture != -1)
GL.DeleteTexture(frameBufferTexture);
//Generate Texture with buffer size;
frameBufferTexture = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, frameBufferTexture);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
if (pixelFormat == VIPixelFormat.VIPF_GREYSCALE) {
//GL.ClearColor(1f, 1f, 1f, 1f);
//GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
}
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)Math.Ceiling(width), (int)Math.Ceiling(height), 0, oglPixFmt, PixelType.UnsignedByte, data);
GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, frameBufferTexture, 0);
//return to previous buffer
ctx.PopFrameBuffer();
}
public int GetFrameBufferId() {
return frameBufferId;
}
public int GetFrameBufferTexture() {
return frameBufferTexture;
}
}
相关上下文调用:
public void PushUseFrameBuffer(IFrameBuffer buf, Size bufferDims) {
frameBufferStack.Push(buf);
OGLFrameBuffer frameBuf = (OGLFrameBuffer)buf;
GL.BindFramebuffer(FramebufferTarget.Framebuffer, frameBuf.GetFrameBufferId());
ctxbounds = new Rectangle(new Point(0, 0), bufferDims);
}
public void PopFrameBuffer() {
frameBufferStack.Pop();
if (frameBufferStack.Count != 0) {
OGLFrameBuffer frameBuf = (OGLFrameBuffer)frameBufferStack.Peek();
GL.BindFramebuffer(FramebufferTarget.Framebuffer, frameBuf.GetFrameBufferId());
}
else {
GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
}
ctxbounds = windowbounds;
}
public void DrawBuffer(IFrameBuffer buff, RectangleF textureBounds, Size parentBounds) {
OGLFrameBuffer toDrawFb = (OGLFrameBuffer)buff;
GL.BindTexture(TextureTarget.Texture2D, toDrawFb.GetFrameBufferTexture());
GL.Begin(PrimitiveType.Quads);
GL.TexCoord2(0.0f, 1.0f); GL.Vertex2((textureBounds.X * scale) / parentBounds.Width , (textureBounds.Y * scale) / parentBounds.Height);
GL.TexCoord2(1.0f, 1.0f); GL.Vertex2(((textureBounds.X + textureBounds.Width) * scale) / parentBounds.Width , (textureBounds.Y * scale) / parentBounds.Height);
GL.TexCoord2(1.0f, 0.0f); GL.Vertex2(((textureBounds.X + textureBounds.Width) * scale) / parentBounds.Width , ((textureBounds.Y + textureBounds.Height) * scale) / parentBounds.Height);
GL.TexCoord2(0.0f, 0.0f); GL.Vertex2((textureBounds.X * scale) / parentBounds.Width , ((textureBounds.Y + textureBounds.Height) * scale) / parentBounds.Height);
GL.End();
OGLFrameBuffer curFb = (OGLFrameBuffer)GetCurrentFrameBuffer();
if (curFb != null) {
GL.BindTexture(TextureTarget.Texture2D, curFb.GetFrameBufferTexture());
}
else {
GL.BindTexture(TextureTarget.Texture2D, 0);
}
SetColour(1, 1, 1, 1f);
DrawRectangle(textureBounds);
}
最佳答案
glFrameBufferTexture 将纹理作为渲染目标关联到帧缓冲区。
这意味着当您发出绘图调用时,该纹理将由您的片段着色器的输出写入(如果启用,则使用混合)。
GlBindTexture 告诉 OpenGL 你想读取这个纹理(例如通过 sampler2D)
简单来说:glFrameBufferTexture 允许您渲染(或写入)此纹理而不是您自己的屏幕,glBindTexture 允许您读取纹理内部的数据(它可以是您编写的纹理,感谢帧缓冲区,或者您创建的纹理加载图像时写的)。
编辑:更一般地说,在 OpenGL 中绑定(bind)一个对象告诉 OpenGL 它将使用该对象进行所有后续操作。
当你想做一个 glTexParameter 时,你必须先绑定(bind)你正在处理的纹理。或使用动态搜索广告; glTexture参数/
对于缓冲区和其他对象也是一样
关于c# - glframebuffertexture 和 glbindtexture 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45483483/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!