我已经为现代OpenGL版本重新实现了OpenCSG.
PixelFormatAttributes:
NSOpenGLPFAColorSize , 24 ,
NSOpenGLPFAAlphaSize , 8 ,
NSOpenGLPFADepthSize , 32 ,
NSOpenGLPFAStencilSize , 8 ,
NSOpenGLPFAAccelerated ,
NSOpenGLPFADoubleBuffer ,
NSOpenGLPFASupersample ,
NSOpenGLPFASampleBuffers, 1 ,
NSOpenGLPFASamples , 4 ,
Run Code Online (Sandbox Code Playgroud)
FBO规格:( 尝试使用多重采样渲染到FBO,但线条越来越强大且可见,请查看底部的屏幕截图)
- 创建功率为2的纹理,GL_RGBA(尝试过GL_RGBA8和GL_RGBA32F)
- GL_DEPTH24_STENCIL8(尝试过GL_DEPTH32_STENCIL8,没有结果)
简单算法Goldfeather:
while (i < depth complexity) {
take channel for render
merge layers if no free channel
render each layer with stencil func, mask and depth params to channel (FBO)
}
merge layers (taking texture from FBO and render objects again …Run Code Online (Sandbox Code Playgroud) 我目前正试图让这个散景着色器与GPUImage一起使用:http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update )
这就是我现在所拥有的:
precision mediump float;
varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
uniform float inputImageTextureWidth;
uniform float inputImageTextureHeight;
#define PI 3.14159265
float width = inputImageTextureWidth; //texture width
float height = inputImageTextureHeight; //texture height
vec2 texel = vec2(1.0/width,1.0/height);
//uniform variables from external script
uniform float focalDepth; //focal distance value in meters, but you may use autofocus option below
uniform float focalLength; //focal length in mm
uniform float fstop; //f-stop value
bool …Run Code Online (Sandbox Code Playgroud) 我有一个 NV21 (YUV420) 相机视频,我在其上应用了片段着色器,以获得一些滤镜效果以及 YUV 到 RGB 的转换。除了性能不佳之外,一切都正常。我的片段着色器有点重,因为它有很多textur2D()调用。
原始帧分辨率是 480x640 像素,我注意到,如果我将视口设置为这个原始大小(而不是全屏大小),它就会工作得很好且流畅。
所以基本上我需要首先渲染帧并在帧缓冲区(FBO)中以原始大小处理它,然后(在着色器工作完成后)使用视口(主要是 1080x1920)将其缩放到全屏大小,这意味着“繁重的”处理工作将应用于少得多的碎片。
我在这里找到了一些教程和类似的问题如何实现这一点,但不幸的是我对此没有运气。(出现一些黑屏或 GL_INVALID_OPERATION 等)...任何帮助将不胜感激。
另外,我不知道如何处理(如果可能的话)的另一个(可选)性能调整是以某种方式将这 3 个纹理(Y_tex、U_tex 和 V_tex)组合为单个纹理,该纹理将统一到着色器作为单个纹理采样器,然后我只需texture2D()在着色器中进行一次调用即可获取当前的 YUV 值并将其转换为 RGB 值。
这是我的渲染器代码:
static class MyRenderer implements GLSurfaceView.Renderer
{
int mTextureIds[] = new int[3];
float[] mScaleMatrix = new float[16];
private FloatBuffer mVertexBuffer;
private FloatBuffer mTextureBuffer;
private ShortBuffer mDrawListBuffer;
boolean mVideoFitEnabled = true;
boolean mVideoDisabled = false;
// number of coordinates per vertex in this array
static final int COORDS_PER_VERTEX = 3;
static final …Run Code Online (Sandbox Code Playgroud) 我想使用 OpenGL ES 将一些图像处理工作移植到 OpenGL 以提高性能。我有一个非常简单的阈值算法,但我想将额外的过滤器组合到图像中(例如对比度)。
我的第一个想法是通过使用多个片段着色器来完成这个。但是,我想很快做到这一点,所以这会导致很多状态变化吗?我读过的唯一方法是通过处理纹理然后多次调用“使用程序”来做到这一点。
有没有更有效的方法来做到这一点?理想情况下,我想在步骤中执行对比度拉伸和直方图平衡。
除非我可以将它组合成一个单一的着色器,否则 FBO 会在这里为我工作吗?
我对 OpenGL 有点陌生(以防万一你不知道)。
谢谢!
西蒙
我对着色器仍然缺乏经验,但我正在很好地攀登学习曲线.
今天早上我偶然发现的一件事是努力在片段和顶点着色器中使用同名的制服.
可以在两个着色器中定义制服,但只能在一个或另一个着色器中访问它,但不能同时访问两者.如果我尝试访问两者中的着色器,程序将无法编译.
我的最后一个想法是将它们编译为单独的符号,但除了glGetUniformLocation之外我不知道如何访问它们.使用相同的字符串调用两次返回相同的统一位置...不是很好的帮助.
着色器非常简单,除了对渲染没有影响的单线工作或非测试外,一切都很完美.
是否有一种特殊方法可以在两个着色器之间使用具有相同值的同名统一?
在WebGL中,是否可以写入片段的深度值或以其他方式控制片段的深度值?
据我所知,gl_FragDepth在webgl 1.x中不存在,但我想知道是否还有其他方法(扩展,浏览器特定支持等)来做到这一点.
我想要存档的是让光线跟踪对象与使用通常的模型,视图,投影绘制的其他元素一起播放.
我在ShaderToy上遇到了几个着色器,我没有成功将它们转换成可以在移动设备上使用的格式,例如.fsh.
我有这个 Shader,我希望能够在移动设备上使用它.
我知道我需要修改iXXXX变量并将mainImage更改为main().
有谁知道我怎么做到这一点?我无法找到任何有关如何执行此操作的资源,也从未遇到过.
float noise(vec2 p)
{
float sample = texture2D(iChannel1,vec2(1.,2.*cos(iGlobalTime))*iGlobalTime*8. + p*1.).x;
sample *= sample;
return sample;
}
float onOff(float a, float b, float c)
{
return step(c, sin(iGlobalTime + a*cos(iGlobalTime*b)));
}
float ramp(float y, float start, float end)
{
float inside = step(start,y) - step(end,y);
float fact = (y-start)/(end-start)*inside;
return (1.-fact) * inside;
}
float stripes(vec2 uv)
{
float noi = noise(uv*vec2(0.5,1.) + vec2(1.,3.));
return ramp(mod(uv.y*4. + iGlobalTime/2.+sin(iGlobalTime + sin(iGlobalTime*0.63)),1.),0.5,0.6)*noi;
}
vec3 getVideo(vec2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Shadertoy转换为Javascript和WebGL,以便它可以独立于Shadertoy运行.Shadertoy具有缓冲区的概念,在此示例中,它重新循环缓冲区并改善输出图像.它在Buf A选项卡上执行此操作.
https://www.shadertoy.com/view/MdyGDW
它通过将其输出写入与iChannel0绑定的缓冲区A然后在每个绘制周期从同一iChannel0读取来完成此操作.如何在WebGL Javascript片段着色器中实现缓冲区的概念,WebGL使用GLSL语言.特别是在这种情况下,它能够写入缓冲区,然后在下一个渲染周期从同一缓冲区读取.
我最近通过opengl教程寻找光线追踪.大多数教程都更喜欢计算着色器.我想知道他们为什么不渲染纹理,然后将纹理渲染为四边形.
计算着色器方法在屏幕四边形上的优缺点是什么?
苹果文档说MTKView当前可绘制的默认大小源自当前 view\xe2\x80\x99s 大小(以本机像素为单位)。有什么方法可以使MTKView当前可绘制的设备屏幕尺寸的一半吗?