我在OpenGL中遇到颜色选择和抗锯齿问题.当AA被激活时,glReadPixels的结果在对象边缘和对象交叉点上显然是错误的.例如:
我在框#32(RGBA:32,0,0,0)附近渲染框#28(RGBA:28,0,0,0).使用AA,由于AA算法,我可以获得错误的ReadPixel值(例如30),其中立方体和三角形重叠,或者框边缘的值为14.
我有~4万个物体我需要能够挑选(这是一个拼图游戏).能够按形状选择对象至关重要.
我试图用glDisable(GL_MULTISAMPLE)禁用AA但它不能用于某些AA模式(我读它取决于AA实现 - SS,MS,CS ......)
那么,我如何选择底层对象?
我目前有一个名为清算的数据框,我想从中运行 30 个随机样本,每个样本包含 1000 个观察值,指定哪个帐户来自哪个样本,然后将其组合成一个新的数据框,其中包含所有 30 个样本:
这是我在使用 dplyr 包进行随机采样时手动完成的,但希望简化它以实现可重复性:
Sample_1 <- liquidation %>%
sample_n(1000)
Sample_1$Obs <- 1
Sample_2 <- liquidation %>%
sample_n(1000)
Sample_2$Obs <- 2
Sample_3 <- liquidation %>%
sample_n(1000)
Sample_3$Obs <- 3
....
Sample_30 <- liquidation %>%
sample_n(1000)
Sample_30$Obs <- 30
Run Code Online (Sandbox Code Playgroud)
然后我将它们全部组合成一个组合数据框:
Combined <- rbind(Sample_1, Sample_2, Sample_3, Sample_4, Sample_5, Sample_6, Sample_7, Sample_8, Sample_9, Sample_10,
Sample_11, Sample_12, Sample_13, Sample_14, Sample_15, Sample_16, Sample_17, Sample_18, Sample_19,
Sample_20, Sample_21, Sample_22, Sample_23, Sample_24, Sample_25, Sample_26, Sample_27, Sample_28,
Sample_29, Sample_30)
str(Combined)
'data.frame': 30000 obs. …Run Code Online (Sandbox Code Playgroud) 我想使用多重采样纹理。
什么是片段着色器以及如何将多个采样器传递给着色器?
另外,哪个 API 可用于加载 texel 数据?
我想为此使用默认的 FBO。
我使用以下代码创建纹理+帧缓冲区(在C#中使用openTK):
public void Create(int width, int height, SurfaceFormat format)
{
bool multisample = format.Multisample > 1;
int samples = Math.Max(1, Math.Min(format.Multisample, 4));
TextureTarget target = multisample ? TextureTarget.Texture2DMultisample : TextureTarget.Texture2D;
Width = width;
Height = height;
textureHandle = GL.GenTexture();
//bind texture
GL.BindTexture(target, textureHandle);
Log.Error("Bound Texture: " + GL.GetError());
GL.TexParameter(target, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
GL.TexParameter(target, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
GL.TexParameter(target, TextureParameterName.TextureWrapS, (int)format.WrapMode);
GL.TexParameter(target, TextureParameterName.TextureWrapT, (int)format.WrapMode);
Log.Error("Created Texture Parameters: " + GL.GetError());
if (format.Multisample < 2)
GL.TexImage2D(target, 0, format.InternalFormat, Width, Height, 0, format.PixelFormat, format.SourceType, format.Pixels);
else …Run Code Online (Sandbox Code Playgroud) 这是我第一次尝试使用opengl进行多重采样(用于抗锯齿).基本上,我正在为屏幕绘制一个背景(不应该得到消除锯齿),然后我绘制应该消除锯齿的顶点.到目前为止我做了什么:
//create the framebuffer:
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
//Generate color buffer:
glGenRenderbuffers(1, &cb);
glBindRenderbuffer(GL_RENDERBUFFER, cb);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, x_size, y_size);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, cb);
//Generate depth buffer:
glGenRenderbuffers(1, &db);
glBindRenderbuffer(GL_RENDERBUFFER, db);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT, x_size, y_size);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, db);
...
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//draw background ... ...
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
//draw things that should get anti-aliased ... ...
//finally:
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, x_size, y_size, 0, 0, x_size, y_size, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
Run Code Online (Sandbox Code Playgroud)
问题是:当我调用glBlitFramebuffer(...)时,整个背景变黑,我只看到消除锯齿的顶点.
有什么建议?
纯粹的超级采样抗锯齿 (SSAA) 和通过每样本着色进行多重采样之间有什么区别
gl4.glMinSampleShading(1.0f);
Run Code Online (Sandbox Code Playgroud)
我更喜欢后者,因为与 SSAA 相比,它不需要更大的纹理,并且提供了很大的灵活性。即:您甚至可以在运行时在 SS 和纯多重采样之间切换。
有什么我不知道的缺点吗?
我正在使用OpenGL es 2.0和java在Android ICS上开发一款2D游戏.我正在尝试使用一个照明系统,为此我将帧缓冲区和场景上的所有灯光渲染到另一个上,目的是使用片段着色器将它们混合以重新创建photoshop叠加效果.
我遇到了一个问题,似乎fbo不适用于多重采样,所以如果我在fbo上绘制我会得到锯齿状的线条.我注意到有人使用ios的解决方案,但我在Android上找不到任何东西.有没有更好的方法来实现我想要做的事情而不是我正在解决这个问题的方式?原谅,我,我对opengl有点新意.
非常感谢你.
在多重采样中,在光栅化期间,每个像素中存在多个采样点,并且确定构成基元的采样点.
哪个属性对于像素中的每个样本都相同?我在某处读到颜色和纹理值相同,但像素中样本的深度和stensil值不同.但是,当为每个采样点执行片段着色器时,它们应该是不同的.
此外,在片段着色器之后,何时在管道中解析多个样本?它们是线性平均的吗?
我在我正在编写的应用程序中使用此示例项目的XNA 4.0表单控件:http: //creators.xna.com/en-US/sample/winforms_series1
它工作得很好,我已经完成了很多视觉和动画.我正在摸不着头脑的主要问题是3D模型和原始3D形状(曲面细分为30的圆柱体)我渲染的边缘非常锯齿状,就好像它们是低分辨率一样.
我试图找出如何启用多重采样,但我在网上找到的所有示例似乎都不适用于在自定义表单控件中使用XNA的这种新方法.
在GraphicsDeviceService()构造函数中,创建了一个PresentationParameters对象,但唯一可用的属性是integer.MultiSampleCount类型为integer.我尝试设置它没有任何效果.
我还尝试将后缓冲区设置为控件大小的两倍(GraphicsDeviceService.cs):
GraphicsDeviceService(IntPtr windowHandle, int width, int height)
{
parameters.BackBufferWidth = width * 2;
parameters.BackBufferHeight = height * 2;
...
}
然后我改变了这个函数(GraphicsDeviceControl.cs):
void EndDraw()
{
Rectangle sourceRectangle = new Rectangle(0, 0, ClientSize.Width * 2, ClientSize.Height * 2);
Rectangle destinationRectangle = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height);
GraphicsDevice.Present(sourceRectangle, destinationRectangle, this.Handle);
}
但这没有奏效.渲染到屏幕的对象被降级到窗口的1/4并被剪裁.尽管看起来确实看起来略显锯齿状......
所以在这一点上我不知道如何使用这种方法(窗口中的XNA控件)来获得高质量的图形.我对XNA很新,所以任何建议都会有所帮助.
谢谢