我想为SKShapeNode添加落下阴影效果.我找到了一个Emboss着色器这是我的代码: let node = SKShapeNode(rectOf: CGSize(width: w, height: h),cornerRadius: w / 4.0) node.position = CGPoint(x: x, y: frame.size.height + h / 2) node.fillColor = color node.strokeColor = .clear node.fillShader = createColorEmboss() let v = simd_make_float2(Float(w),Float(h)) node.setValue(SKAttributeValue(vectorFloat2: v), forAttribute: "a_size") func createColorEmboss() -> SKShader { let source
以下是关于 shader 的编程技术问答
我想编写一些着色器(Surface/Fragment/...),以重新涂上一些新颜色的扩散纹理.目前,我有此版本的着色器(我正在尝试实时重新彩色纹理): //sm_surf uniform vec4 colorTarget; (used in full version) uniform vec4 colorTint; (used in full version) vec4 colorTexture = texture2D(u_diffuseTexture, _surface.diffuseTexcoord); //vec4 colorTexture = _sample.diffuse;//the same result vec4 tinted = colorTexture; tinted.r = max(0.0, colorTexture.r - 0.2); _surface.diffuse = tinted; 这是OpenCV中的代码(我只是事先重新上色,并将其用作新的
我想将纹理数据作为计算着色器中的1D数组使用.我读到最好的方法是将其作为缓冲区而不是1D纹理传递. 我正在加载纹理: let textureLoader = MTKTextureLoader(device: device) do { if let image = UIImage(named: "testImage") { let options = [ MTKTextureLoaderOptionSRGB : NSNumber(value: false) ] try kernelSourceTexture = textureLoader.newTexture(with: image.cgImage!, options: options) kernelDestTexture = device.makeTexture(descriptor: kernelSourceTexture!.matchingDescript
我需要使用SpriteKit实现自定义着色器节点. 在模拟器中,一切都可以.在设备(iPad 3rd Gen)上的着色器动画仅在第一个〜30秒的情况下平滑,此后着色器的FP逐渐掉落,直到看起来像幻灯片(1 fps或更少) 值得注意的是,SpriteKit显示60 fps,Xcode也是如此. CPU忙于75%,但着色器本身显示〜1fps. 我只有第三代iPad,目前没有机会在其他设备上进行测试 着色器代码来自WWDC会话,但是问题是我尝试过的任何动画着色器. . 着色器本身: void main(void) { float currTime = u_time; vec2 uv = v_tex_coord; vec2 circleCenter = vec2(0.5, 0.5); vec3 circleColor = vec3(0.8, 0.5, 0.7); vec3 posColor = vec3(uv, 0.5+0.5 *
有标准的着色器功能库,例如 解决方案 没有可靠的资源可以告诉您各种标准的着色器功能需要多长时间.甚至没有特定的硬件. 这样做的原因与指令计划和现代着色器体系结构的工作方式有关.采用简单的sin函数.假设硬件具有特殊的硬件来计算值的正弦,因此它不会手动使用裁缝系列或其他内容.但是,我们还可以说,实际计算4个opcodes的顺序.因此,sin将采用" 4个周期". 然而,,所有这些操作码都是标量操作.因此,在进行他们的过程中,您实际上可能会有一些3矢量点产品,或者在某些硬件的情况下,4-vector Dot-Products同时进行,,在同一处理器上.因此,如果硬件具有带标量操作的4个矢量点产品,则执行A sin和矩阵矢量倍数所需的周期数量是...仍然是4. 那么sin操作的成本是多少?如果您取出矩阵乘数,则不会更快.如果您取出sin,则没有任何更快的速度.它要多少钱?您不能说,因为一次操作的成本无关紧要.唯一可测量的数量是着色器本身的成本. 最终,您所能做的就是尝
我已经阅读了一些有关GLSL的教程. 在某些位置,属性是某些VEC3中的VEC4. 我知道矩阵操作需要VEC4,但是要发送附加元素值得吗? 发送VEC3和后来在着色器VEC4(位置为1.0)中发送的vec3和铸件不是更好吗? 记忆中的数据较少 - 它会更快吗?否则我们应该打包一个额外的元素以避免铸造? 有什么技巧应该更好? layout(location = 0) in vec4 position; MVP*position; 或 layout(location = 0) in vec3 position; MVP*vec4(position,1.0); 解决方案 对于顶点属性,这无关紧要.缺乏时,第四个组件会自动扩展到1.0. 也就是说,如果您将3维顶点属性指针传递给4维矢量,则GL将使用W W为您填充.我总是走这条路线,它避免了在位置上执行矩阵乘法时必须明确编写vec4 (...),并且还避免了浪费存储存储第四个组件的内存. 顺便说一句,这也适
我知道这个问题似乎有些无法接下来,但是如果某人知道理论上的任何知识/在此主题上具有实际经验,那么如果您分享它,那就太好了. 我正在尝试优化我的一个旧着色器,它使用了许多纹理查找. 我有三个可能的映射平面中的每一个,并且对于用户附近的某些面孔,我都有弥漫性,正常,镜头地图,我还必须应用映射技术,这也带来了很多纹理查找(例如parallax occlusion mapping). 分析表明,纹理查找是着色器的瓶颈,我愿意将其中一些删除.对于,我已经知道,输入参数的某些情况 我已经不需要纹理查找的部分,并且显而易见的解决方案是做类似(pseudocode): if (part_actually_needed) { perform lookups; perform other steps specific for THIS PART; } // All other parts. 现在 - 这是一个问题. 我不记得确切的(这就是为什么我说这个问题可能
好的,我的主观问题已经改变.我如何更改如何实现类似的强度? DayToNight.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 在我梦dream以求的世界中,它会像这样 DayToNight.setXfermode(new PorterDuffXfermode(Mode.DST_IN(10))); 10是强度的水平. 一个例子是,如果我有一支闪烁的蜡烛,当蜡烛燃烧明亮时,我想要我要绘制的位图以保留其oildanol的颜色和亮度,当它闪烁时,我希望将钻头绘制几乎被遮黑,我想在光线变暗时将其变暗. 我有方程式,计时器和所有内容,只是如何实际应用它来改变颜色/亮度. 也许燃烧图像是我想要的? 我只想改变轻度大声笑. 我觉得要使用paint.setshader可能是一个解决方案,但是该领域的信息比我能够找到的信息非常有限.任何帮助将不胜感激. 编辑:要保持清晰,我正在寻找一种减轻/暗
给出了两个图像打击,我将第一个图像称为框架图像,第二张图像为帧图像.fst是我的线性布局,我将帧图像设置为其背景图像.现在,我想在框架图像的白色区域中填充图像图像.框架图像的外部区域是透明的,内部区域为白色. 我如何在框架图像中填充模式图像.我尝试了此代码. private void patternFill(Bitmap tempBitmapColor) { Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pattern_a); BitmapDrawable bitmapDrawable = new BitmapDrawable(bmp); bitmapDrawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); fst.setBackgroundDraw
我发现令人沮丧的是,很难找到Sampler2D阵列的示例,例如 uniform sampler2D myTextureSampler[5]; 一个人将如何存储它的统一位置?: gl.GetUniformLocation(program, "myTextureSampler") 可以简单地使用: gl.GetUniformLocation(program, "myTextureSampler[0]") gl.GetUniformLocation(program2, "myTextureSampler[2]") 如何使用这样的多种纹理: gl.BindTexture(gl.TEXTURE_2D, 1) gl.BindTexture(gl.TEXTURE_2D, 2) 等. gl.ActiveTexture(gl.TEXTURE0) gl.ActiveTexture(gl.TEXTURE1) 等. 注意:此代码不是纯C ++ OpenGL
你们中的许多QT(特别是4.6个)用户将熟悉OpenGL教程中提供的过度示例,我正在尝试做一些非常相似的事情,但使用着色器用于纯openGL数据,而不是旧的固定功能管道. // Set background and state. makeCurrent(); qglClearColor( bgColour_ ); glEnable( GL_DEPTH_TEST ); glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); if ( smoothLines_ ) { glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glEnable( GL_LINE_SMOOTH ); glHint( GL_LINE_SMOOTH_HINT, GL_NICEST ); } // Clear the buffers. glCle
我正在关注" OpenGL编程指南8版".我只想运行我的Mac上书中介绍的第一个程序. 是Mavericks + Xcode 4.6.1 + Intel HD Graphics4000.因此,问题是,着色器无法编译. 着色器代码: #version 410 core layout(location = 0) in vec4 vPosition; void main() { gl_Position = vPosition; } 错误消息是: Shader compilation failed: ERROR: 0:1: '' : version '410' is not supported ERROR: 0:1: '' : syntax error #version ERROR: 0:3: 'layout' : syntax error syntax error 我尝试了版本420/400/330,它们都没有工作. 顺便说一句,该程序使用最
我有一个着色器,我想在顶点着色器中移动一半的顶点.我正在尝试从性能的角度来决定最佳方法,因为我们正在处理超过100,000个Vert,因此速度至关重要.我看过3种不同的方法:(伪代码,但足以给您这个想法.函数调用(只是返回一个数字,但仍然是功能调用),以及浮点数号的一堆基本算法). if (y ; } 这具有一个优势,即仅执行一半的时间,但缺点是它肯定会导致分支,这实际上可能比公式慢.它是最可读的,但是在这种情况下,我们更关心速度而不是可读性. x += step(y, 0.5) * ; 使用hlsl的step()函数(如果第一个参数更大,则返回0,如果1返回),则可以消除分支,但是现在每次都调用,并且其结果乘以0(因此浪费了)一半的时间. x += (y
在像素着色器中实现卷积的质地数量很高. 实现卷积滤波器的直接方法是使用两个片段使用两个循环来使每个片段的查找.一个简单的计算表明,与4x4高斯内核模糊的1024x1024图像需要1024 x 1024 x 4 x 4 = 16M查找. 一个人可以做什么? 可以使用一些需要更少查找的优化?我对诸如高斯(或它们是特定于内核?) 之类的内核特异性优化不感兴趣. 至少可以通过以某种方式利用可以使用的像素的局部性来更快地使这些查找? 谢谢! 解决方案 高斯内核是可分离的,这意味着您可以先进行水平通行证,然后再进行垂直通行证(或相反的方式).这将O(n^2)变成O(2n).它适用于所有可分离的过滤器,不仅适用于模糊(不是所有所有过滤器都是可分离的,但许多过滤器是可以分开的,有些是"一样的"). 或,在特定的模糊过滤器(是否没有高斯)的情况下,这些都是"加权总和",您可以利用纹理插值的优势,对于小内核尺寸而言,这可能更快(但绝对不适合较大的内核尺寸).
我对sin()和cos()的速度的信息感兴趣 glsl specification /p> 内置功能基本上分为三类: ... ... 它们代表一个操作图形硬件可能会在某个时候加速.三角学的功能属于 类别. 编辑: 正如所指出的那样,计算sin()和cos()的单个操作的时钟周期并不能真正讲述整个表演故事. 因此,要澄清我的问题,我真正感兴趣的是是否值得优化sin()和cos()呼吁普通案例. 例如,在我的应用程序中,该参数为0非常普遍.这样的东西也很有意义: float sina, cosa; if ( rotation == 0 ) { sina = 0; cosa = 1; } else { sina = sin( rotation ); cosa = cos( rotation ); } 或GLSL编译器或sin()和cos()实现对我的优化? 解决方案 例如,在我的应用程序中,论点是0.
我想隐藏在C/C ++程序中用作字符串的文本信息(GLSL着色器),因为它们在二进制中直接可读.因此,我考虑了在编译/构建时间期间加密文件,并在运行时解密数据以继续使用重建的着色器. 但是,在C程序中的库(EVP)与库(EVP)一起使用OpenSSL时,我有一些麻烦.我必须承认,我绝不是密码学专家,但现在必须参与这个话题... 这是我尝试过的: // on the console: openssl enc -aes-256-cbc -salt -in shader.frag -out shader.frag.enc // ... // in the program: //// read enc file //// int lengthIN; char * buffer_encIN; ifstream is2; is2.open( "/Path/To/My/Shader/shader.frag.enc", ios::binary ); // get l
使用OpenGL实现了我应用程序的一项功能. 然后,我发现该功能在Nexus 6上工作失败了.我有两个Nexus 6可以测试. 每次我使用时,一个人都会崩溃,但大多数时候都遇到了结果(这意味着它工作了几次). 我试图找出原因,发现如果我不使用Mat2变量,则该应用程序不会崩溃. uniform u_rotation; varying highp vec2 v_texcoord; const vec2 center = vec2(0.5); mat2 rotation = mat2(cos(u_rotation), sin(u_rotation), -sin(u_rotation), cos(u_rotation)); void main() { vec2 pcoord = center + rotation * (v_texcoord - center); ... } 我不知道那时发生了什么. 解决方案 根本原因是我使用主块外部的均匀变量定义了一个变量.
我在libgdx中的片段着色器有问题.下面是我的碎片着色器. #ifdef GL_ES precision mediump float; #endif uniform float u_aspectRatio; varying vec2 v_texCoords; uniform sampler2D u_texture; void main() { gl_FragColor = texture2D(u_texture, v_texCoords); } 在程序中我做 shader.setUniformi("u_texture", 0); // work fine shader.setUniformf("u_aspectRatio", 0.0f); //no uniform with name 'u_aspectRatio' in shader shader.iscompiled()
在我使用着色器修饰符的实验中,我看到数组数据无法传输到着色器. scenekit在OpenGL着色器中将数组数据传递给统一数组时给出缓冲区尺寸错误 因此,我决定尝试SCNPROGRAM.但是现在我意识到我使用SCNProgram添加的着色器不起作用. 这个问题有特殊原因吗? 我用于测试的超级简单着色器; 顶点着色器 precision highp float; attribute vec3 vertex; uniform mat4 ModelViewProjectionMatrix; void main() { gl_Position = ModelViewProjectionMatrix * vec4(vertex, 1.0); } 碎片着色器 precision mediump float; void main( void ) { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
我只是想用glsurfaceview编写简单的Android应用程序,但我有一个问题. 我写了简单的着色器程序蚂蚁将一个浮点参数放在那里.这是我的 顶点着色器: attribute vec2 vPosition; attribute vec2 vTexCoord; varying vec2 texCoord; void main(){ texCoord = vTexCoord; gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0, 1.0 ); } 片段着色器: precision mediump float; uniform samplerExternalOES sTexture; uniform float myParam;