我想从图像中获得透明效果,现在我只是用圆环进行测试,但着色器似乎不适用于 alpha。根据我从这个线程(在Scenekit中使用混合函数)和这个关于透明度的wiki链接的理解:(http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Transparency),被SceneKit中GLBlendFunc替换。pragma transparency
你知道这段代码有什么问题吗?
我使用 SceneKit 创建了一个新项目,并将船舶网格更改为圆环。
编辑:
我正在尝试使用飞机,但下面的图像没有出现在飞机内部,而是得到下面带有红色和棕色框的图像。
我的阿尔法图像:

结果(带有 alpha 的图像应替换棕色):

let plane = SCNPlane(width: 2, height: 2)
var texture = SKTexture(imageNamed:"small")
texture.filteringMode = SKTextureFilteringMode.Nearest
plane.firstMaterial?.diffuse.contents = texture
let ship = SCNNode(geometry: plane) //SCNTorus(ringRadius: 1, pipeRadius: 0.5)
ship.position = SCNVector3(x: 0, y: 0, z: 15)
scene.rootNode.addChildNode(ship)
let myscale : CGFloat = 10
let box = SCNBox(width: myscale, height: myscale, length: myscale, chamferRadius: 0)
box.firstMaterial?.diffuse.contents = UIColor.redColor()
let theBox = SCNNode(geometry: box) …Run Code Online (Sandbox Code Playgroud) 我试图用正弦波扭曲圆的绘制,使其在 OpenGL 着色器中看起来像这样。
我发现了许多使用length中心点半径来绘制圆的示例,但我无法弄清楚如何用正弦波对其进行调制以扭曲圆半径。任何帮助将不胜感激!
我正在尝试将 Pixi v3 的自定义着色器转换为 v4。
原文在这里: http://www.awwwards.com/a-gentle-introduction-to-shaders-with-pixi-js.html
相关的 CodePen 位于 http://codepen.io/omarshe7ta/pen/xVeWWy
到目前为止,我已经得到了这个:
function CustomFilter(fragmentSource) {
PIXI.Filter.call(this,
null,
fragmentSource
);
}
CustomFilter.prototype = Object.create(PIXI.Filter.prototype);
CustomFilter.prototype.constructor = CustomFilter;
// smoke shader
var shaderCode = document.getElementById('fragShader').innerHTML
var smokeShader = new CustomFilter(shaderCode);
smokeShader.uniforms.resolution[0] = width;
smokeShader.uniforms.resolution[1] = height;
smokeShader.uniforms.alpha = 1.0;
smokeShader.uniforms.shift = 1.6;
smokeShader.uniforms.time = 0;
smokeShader.uniforms.speed[0] = 0.7;
smokeShader.uniforms.speed[1] = 0.4;
var bg = PIXI.Sprite.fromImage("pixi_v3_github-pad.png");
bg.width = width;
bg.height = height;
bg.filters = [smokeShader]
stage.addChild(bg);
var logo = PIXI.Sprite.fromImage("pixi_v3_github-pad.png");
logo.x = width …Run Code Online (Sandbox Code Playgroud) 我希望在一个着色器中组合两个纹理,就像您对 Photoshop 之类的程序所期望的那样。也就是说,一种纹理叠加在另一种纹理之上,就好像分层一样。两个纹理都将具有 Alpha,并且结果输出也应具有正确的组合 Alpha。
然而,尽管用谷歌搜索公式,我无法得到正确的颜色。使用此处的参考:(https://microsoft.github.io/Win2D/html/PremultipliedAlpha.htm)例如产生;
(注意灰色 50% 叠加的差异)
着色器代码在 libgdx 中设置以使用它作为混合;
context.setBlending(true,GL20.GL_SRC_ALPHA ,GL20.GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
我相当确定错误出在我的片段着色器混合中(请参见上图中的代码),因为如果我将输入纹理 (A) 直接传递给 gl_FragColor,那么我会得到 A 的像素完美颜色匹配,包括其 alpha。
例如;
gl_FragColor = 反向漫反射;
工作正常。
=====
编辑
根据建议,我尝试使用预乘阿尔法代替。
context.setBlending(true,GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
然而,即使着色器刚刚设置为输出 A,这也会产生错误的效果
backdiffuse = texture2D(u_backSample2D, vTexCoord);
backdiffuse=backdiffuse*backdiffuse.a; //convert to premultiply
gl_FragColor = backdiffuse;
Run Code Online (Sandbox Code Playgroud)
我是否将 libgdxs 混合设置错误?这显然太亮了。
解决方案(感谢接受的答案);
backdiffuse.rgb *= backdiffuse.a; //premultiply source
v_backBackColor.rgb *= v_backBackColor.a; //premultiply source
finalCol.rgb = backdiffuse.rgb + (v_backBackColor.rgb * (1 - backdiffuse.a));
finalCol.a = backdiffuse.a + (v_backBackColor.a * (1.0 - …Run Code Online (Sandbox Code Playgroud) GLSL 给出这样的错误:
无法从“highp float”转换为“highp float 3分量向量”
T选择了错误部分:
vec3 bRgb = texture2D(u_img1, vUv).rgb;
vec3 aRgb = texture2D(u_aImg, vUv).rgb;
vec3 target1 = aRgb * bRgb;
vec3 alum = dot( aRgb, w );
vec3 blum = dot( bRgb, w );
vec3 clum = dot( target1, w );
vec3 target2 = (alum + blum) / (2. * clum); // This is the error line
gl_FragColor = vec4(target2, 1.);
Run Code Online (Sandbox Code Playgroud)
我可以找到错误行,但我不知道如何让它运行。
我对 SpriteKit 中着色器的概念和使用非常陌生。
我发现本教程介绍了如何使用附加到 Color Sprite 的自定义着色器属性的自定义着色器文件 - Fractal.fsh 渲染 Mandelbrot 分形。
https://www.weheartswift.com/fractals-Xcode-6/
它工作得很好,我认为学习 OpenGL ES 和 SpriteKit 中的自定义着色器将是一个有趣的练习。
不过,根据 Apple 的说法,OpenGL ES 自 iOS 12 起已被弃用。
我的问题是这样的:
这是否意味着 SpriteKit 中使用的自定义着色器现在应该用 Metal 编写?
我试图弄清楚如何在 Metal 中重写第一个链接中提到的 fractal.fsh 着色器代码,但我还没有找到任何有关如何将现有自定义 SKShader 从 OpenGL ES 转换为 Metal 的资源。然而,我并不是在寻找有人重写该代码以使用 Metal,而只是寻找一个指向正确方向的指针。
更新: 根据@Knight0fDragon 的回答,我将尝试澄清我的问题:
SKShader 类的文档指出:
“SKShader 对象包含自定义 OpenGL ES 片段着色器。”
https://developer.apple.com/documentation/spritekit/skshader
那么,如果 SKShader 对象拥有自定义的 OpenGL ES 片段着色器,那么在对 OpenGL ES 的支持被弃用后,它将拥有什么?
如果从 iOS 12 开始无法使用 OpenGL ES,那么如何继续创建一个在 SpriteKit 中使用的自定义片段着色器呢?首先,我认为包含 GLSL 代码的 *.fsh 文件可以替换为包含等效金属代码的 *.metal …
这是我第一次处理使用 Angular 构建的项目,因此我仍在习惯针对 Angular 和 WebPack 的大量实践。
我希望在全屏画布中加载自定义片段着色器(.frag/.glsl)以用作组件的背景。对于过去的模型或其他不使用角度的项目,我设法在GlslCanvas等库的帮助下轻松做到这一点,这些库管理全屏四边形和基本制服的设置,但现在我无法弄清楚向我抛出的一些错误当尝试构建我的角度应用程序时。
经过几个小时的浏览,我找到了如何成功导入着色器代码,使用GLSL-shader-loader并通过 @Angular-devkit/build-Angular 和 @Angular-builder/custom-webpacks 添加自定义 Webpack 配置:
# my-custom-webpack.config.js
module.exports = {
module: {
rules: [{
test: /\.(frag|vert|glsl)$/,
use: [
{
loader: 'glsl-shader-loader',
options: {}
}
]
}]
}
}
Run Code Online (Sandbox Code Playgroud)
我还了解到我必须通过定义所需的声明来阻止打字稿抱怨导入时的非 ts 模块,即:
# my-declarations.d.ts
declare module '*.glsl';
declare module '*.frag';
declare module '*.vert';
Run Code Online (Sandbox Code Playgroud)
此时,片段着色器的代码已正确导入(或者我认为是这样?),我可以将其记录或打印出来(例如{{ myShaderCode }}):
# glsl-bg.component.ts
import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';
import frag from './myShader.frag';
import * as GlslCanvas …Run Code Online (Sandbox Code Playgroud) 我试图让我的着色器在 Shaderfrog 中工作,我通过 URL 导入我的 glsl 沙箱版本。
我收到错误:“C:\fakepath(111,2-27):警告 X3550:数组引用不能用作左值;本身不可寻址,强制循环展开。
真的不确定为什么会发生这个错误,我尝试取消循环内的任何循环,但无济于事。
这是我的片段代码:
#extension GL_OES_standard_derivatives : enable
precision highp float;
varying vec2 vUv;
uniform float time;
uniform vec2 resolution;
void main()
{
vec2 p = vUv.xy / resolution.x * .05;
vec3 col;
for (float j = 0.; j < 3.; j++) {
p.x += ((0.05 / 2.0) * sin(2.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 2.0)) * 2.0)));
p.y += ((0.02 / 2.0)* cos(2.0 * 10. * …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用GLSL片段着色器中场景中对象的未缩放距离(与前裁剪平面的真实距离)。gl_FragCoord.z值比我预期的要小。在我的顶点着色器中,我仅使用ftransform()设置gl_Position。我期望2到3之间的值在15到20之间。
如何获得真实的眼空间深度?谢谢!
我的片段着色器中有两个采样器数组:
uniform sampler2D shadowMaps[12];
uniform samplerCubeShadow shadowMapsCube[12];
Run Code Online (Sandbox Code Playgroud)
这在使用opengl 4.2的计算机上可以正常工作,但是在我的笔记本电脑(opengl 3.1)上,我收到错误消息“数组大小太大”。
如果将其设置为8,则可以正常工作。但是其他类型的数组可能更大,我可以添加更多最大大小为8的采样器数组,而不会出现问题。那么,如何确定此限制?
将数组大小减小到8后,编译工作成功,但是链接无提示失败(日志为空,并且glGetError()返回0)。
如果我分别声明每个采样器(统一sampler2D shadowMap1;统一sampler2D shadowMap2等),则不会发生这些错误。