我很想知道很长一段时间处理OpenGL FrameBuffer对象(FBO)的最佳方法.切换FBO可能成本很高,但也定义了新的附件.
你怎么快速做到的?
我在这三个之间犹豫不决:
1 FBO用于所有内容,更改附件但不要在FBO之间切换
1渲染路径中每个渲染目标(大小+格式)的FBO.这意味着我将为相似的渲染目标重用相同的FBO.但这样一种自定义模糊将花费4+ FBO.
每个渲染目标1个FBO,仅设置附件一次,然后在FBO之间切换
另外,我应该最小化FBO开关的数量(比如我最小化纹理绑定的数量)?
我想通过使用opengl绘制体素,但似乎不支持它.我制作了一个具有24个顶点(每个面4个顶点)的立方体绘图功能,但是当你绘制2500个立方体时它会降低帧速率.我希望有更好的方法.理想情况下,我只想向显卡发送位置,边缘大小和颜色.我不确定是否可以通过使用GLSL将指令编译为片段着色器或顶点着色器的一部分来实现此目的.
我搜索谷歌,发现了点精灵和广告牌精灵(同样的事情?).这些可以用作更快地绘制立方体的替代方法吗?如果我使用6,每个脸一个,似乎会向显卡发送更少的信息,并希望获得更好的帧速率.
另一个想法是,我可以使用一个drawelements调用绘制多个立方体?
也许有一种我不了解的更好的方法?任何帮助表示赞赏.
使用案例:我正在使用WPF在Web上下文中动态覆盖图像上的文本.
解决方案:我使用的是DrawingContext从DrawingVisual(包裹在一个using声明中)来绘制原始位和覆盖文本.
问题:在几千个请求之后,该[DrawingVisual].RenderOpen()方法开始拒绝执行并抛出以下异常:
The system cannot find the file specified System.ComponentModel.Win32Exception UInt16 RegisterClassEx(WNDCLASSEX_D) at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at System.Windows.Media.MediaContextNotificationWindow..ctor(MediaContext ownerMediaContext)
at System.Windows.Media.MediaContext..ctor(Dispatcher dispatcher)
at System.Windows.Media.MediaContext.From(Dispatcher dispatcher)
at System.Windows.Media.Visual.VerifyAPIReadWrite()
at System.Windows.Media.DrawingVisual.RenderOpen()
at ...
Run Code Online (Sandbox Code Playgroud)
临时修复:唯一的解决方法是在服务器上回收IIS应用程序池,将问题解决几个小时.
问题:任何人都想过这个问题的原因(泄漏,线程,非托管代码等)?有没有其他方法可以在图像上获取文本,避免绘图视觉?也许将几何图形写入位图并直接覆盖位图?
我刚刚继承了在JSF中实现的项目.我有以下代码在Chrome中看起来不错,但Firefox在"空"列表项上呈现边框:
<ul>
<li><a href="/home">Home</li>
<li>
<s:link view="/signup.xhtml" rendered="#{someCondition}">Sign Up</s:link>
</li>
<!-- etc... -->
</ul>
Run Code Online (Sandbox Code Playgroud)
最终看起来像:

是否有一个JSF标签有条件地渲染<li>?
设计人员总是使用不透明度而不是实际颜色值来提供CSS.这会影响浏览器中的渲染性能吗?
在总是白色的背景下渲染速度更快,我实际上并不关心透明度.
<span>Hello</span>
Run Code Online (Sandbox Code Playgroud)
span {color: black; opacity: 0.7;}span {color: rgba(0, 0, 0, 0.7);}span {color: #b3b3b3;}我的直觉表示不透明度较慢(尽管放在GPU中),因为现在在渲染时,浏览器必须考虑背景,因此任何更改都会导致它重新绘制对象,因为这种透明性,而静态彩色对象将从不改变.
我一直在使用OpenGL了大约一年了,学到了很多东西.不幸的是我的方式得知这是旧的预3.x的方式,这意味着即时模式,默认着色器,矩阵堆栈等我或多或少都有哪些通过观察OpenGL的规格已经从再改为现在的想法,但是我并不完全了解一些新的做事方式.
从我的理解,他们摆脱了矩阵堆叠的,这意味着你必须跟踪自己的变换矩阵,这似乎并没有太复杂的.他们还摆脱了直接模式,这意味着你现在需要使用维也纳组织或VAOs(永远不知道哪一个,或许两个..)发送像素/正常/纹理等.着色器程序的信息.我真的不明白这些对象的工作方式,我认为你需要把所有的信息放进去,并提供某种形式的OFSET显示像素,正常和纹理坐标之间的分隔符.有人可以简单解释一下这实际上是如何工作的(或者给我一个解释它的链接)?我尝试维基百科和谷歌搜索,但发现自己还是没有完全理解它们.
我想更多地了解的另一点是着色器,因为我从未使用它们.我不会问如何编写它们或任何东西,只需要在那里进行什么以及opengl仍然为你做什么.更具体地说,您需要在着色器中执行哪些操作才能获得基本渲染程序?我知道你需要做所有的计算并使用你的矩阵来计算真实的顶点位置.但是opengl是否仍然会处理背面剔除,线条剪裁,多边形填充和其他较低级别的问题,或者您是否必须将它们编码到着色器中(或者它们甚至不属于着色器)?
有很多关于渲染高质量图形的帖子,比如这个
我需要使用GDI +在图形中渲染大约6k +对象(线和椭圆),帧速率大约为10fps.所以我的图形需要最低质量的属性.
这是我做的:
public static class GraphicsExtensions
{
public static void ToHighQuality(this Graphics graphics)
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
}
public static void ToLowQuality(this Graphics graphics)
{
graphics.InterpolationMode = InterpolationMode.Low;
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.SmoothingMode = SmoothingMode.HighSpeed;
graphics.TextRenderingHint = TextRenderingHint.SystemDefault;
graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
}
}
Run Code Online (Sandbox Code Playgroud)
我忘记了什么,或者这是图形属性的最佳极值?
我使用较低模式绘制5fps(202ms /图像),使用较高模式绘制3fps(330ms /图像).
我觉得没有太大的区别,但是我把性能问题减少到只画画......
一些数字:
我的渲染代码中有一个非常大的设计绊脚石.基本上这是什么,不需要API特定代码(例如OpenGL代码或DirectX).现在我已经考虑了很多方法来解决这个问题,但是我不确定使用哪一个,或者我应该如何改进这些想法.
举一个简短的例子,我将以纹理为例.纹理是表示GPU存储器中的纹理的对象,实现方式它可以以任何特定方式类似,即实现是否使用GLuint或LPDIRECT3DTEXTURE9类似于纹理.
现在,我已经想到了实际实现这一点的方法.我不确定是否有更好的方式,或者哪种方式比另一方更好.
我可以使用继承,这似乎是这件事最明显的选择.但是,此方法需要虚函数,并且需要TextureFactory类才能创建Texture对象.这需要调用new每个Texture对象(例如renderer->getTextureFactory()->create()).
以下是我在这种情况下考虑使用继承的方法:
class Texture
{
public:
virtual ~Texture() {}
// Override-able Methods:
virtual bool load(const Image&, const urect2& subRect);
virtual bool reload(const Image&, const urect2& subRect);
virtual Image getImage() const;
// ... other texture-related methods, such as wrappers for
// load/reload in order to load/reload the whole image
unsigned int getWidth() const;
unsigned int getHeight() const;
unsigned int getDepth() const;
bool is1D() …Run Code Online (Sandbox Code Playgroud) 我的IE 11和我的react应用有问题。我使用Webpack,babel和polyfill.io cdn,在渲染捆绑文件之前一切都很好,然后它停止执行任何操作。您知道什么地方可能出问题吗?
提前致谢。