在我的项目中,我使用“丢弃”调用来执行自定义模板测试,该测试尝试仅在由模板纹理定义的指定区域上绘制内容。这是片段着色器的代码:
//get the stencil value from a texture
float value=texture2D( stencilTexture, gl_FragCoord.xy/1024.0).x;
//check if value equals the desired value, if not draw nothing
if(abs(value-desiredValue)>0.1)
{
discard;
}
Run Code Online (Sandbox Code Playgroud)
该代码可以工作,但由于“丢弃”调用而出现性能问题。是否有其他方法可以通过 GPU 着色器来实现此目的?告诉我怎么做。
我读了很多关于 OpenGL 4 中与 OpenGL 1 相比的新概念的内容。我的问题是,在旧的 GLSL 中,我可以使用预定义的 gl_Vertex 在我的顶点着色器中进行开箱即用的计算。但在当前的 4.1 版本中,这一点已被删除。
关于这一点有很多问题,但没有人给出如何在着色器中实际使用旧的 gl_Vertex 的示例。我发现了一些可能性,例如layout (location = 0) in vec3 vertexpos;或glBindAttribLocation(shader, 0, "vertexpos");。但没有任何地方解释我从哪里获得当前顶点位置存储在哪个索引中的知识。实际上,我发现这个网站有索引,但这似乎不适用于上述代码片段。
也许有人可以在黑暗中带来光明并展示一个很小的例子。
我有三个与 GLSL 自动优化(?)过程相关的问题。
未使用的变量 -> glsl 会删除所有不影响最终片段着色器像素(输出变量)的变量。
未使用的函数 -> glsl 是否删除了 void main... 之前所有未使用的定义函数?
那么来龙去脉的变量又如何呢?一个例子:我有 100 个着色器,它们将纹理坐标从顶点着色器发送到片段着色器。在片段着色器中,这些坐标对最终颜色没有影响。glsl 会删除这个变量吗?
这可能是一个有点幼稚的问题,所以请放轻松。但我在shadertoy.com上查看着色器时,对3D 场景的glsl 代码如此之小感到惊讶。深入挖掘后,我注意到大多数着色器如何使用一种称为光线行进的技术。
这种技术可以避免完全使用顶点/三角形,而只需使用像素着色器和一些数学来创建一些相当复杂的场景。
所以我想知道为什么 3d 场景经常使用带有 webgl 的三角形网格,而不是仅仅使用像素着色器。我们不能只使用 glsl 和像素着色器(又名片段着色器)渲染整个场景吗?
我在 glsl 中制作了一个示例代码,我正在使用它if(diffuse.rgb > vec3(1)),它给出了“无法比较向量或矩阵”错误。如果我这样做,if(diffuse.rgb == vec3(1))它运行时不会出现错误,谢谢。
我正在尝试使用着色器运行程序.在我提出的另一个问题中,我发现我正在将固定的管道功能与新的东西混合(来自OpenGL 2.0),所以我试图删除像glMatrixMode这样的所有"旧东西",但我不确定我是不是做得对.怀疑我还删除了像glLightfv这样的调用,如果我使用可编程管道,我不确定它们是否被允许.
这是主要代码:
#include <GL/glew.h>
#include <GL/glut.h>
#include <iostream>
#include <vector>
#include "utility.hpp"
#include "program.hpp"
GLfloat width=600, height=800;
Program* program_ref;
void init()
{
glewInit();
Shader vertex_shader= Shader("vertex_shader",GL_VERTEX_SHADER);
// This just reads the file "vertex_shader", creates the shader and compiles it
Shader geometry_shader= Shader(); // This means that the shader is empty
// So the program class will be enough smart to recognize it and don't attach it
Shader fragment_shader= Shader("fragment_shader",GL_FRAGMENT_SHADER);
program_ref= new Program(vertex_shader,geometry_shader,fragment_shader);
// This creates a program, …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenGL着色器构建器v2.2.2并从书中获取示例代码.对于顶点着色器
#version 140
uniform float CoolestTemp;
uniform float TempRange;
uniform mat4 MVPMatrix;
in vec4 mcVertex;
in float VertexTemp;
out float Temperature;
void main() {
Temperature = (VertexTemp - CoolestTemp) / TempRange;
gl_Position = MVPMatrix * mcVertex;
}
Run Code Online (Sandbox Code Playgroud)
对于片段着色器
#version 140
uniform vec3 CoolestColor;
uniform vec3 HottestColor;
in float Temperature;
out vec4 FragmentColor;
void main()
{
vec3 color = mix(CoolestColor, HottestColor, Temperature);
FragmentColor = vec4(color, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是执行此代码,因为不支持版本140和320.然后我尝试删除版本,编译器在'全局变量上下文中'表示"无效限定符"和'out'相同,然后尝试将in/out替换为'vary'但在片段着色器中"赋值的左侧"不得为只读"错误出现.对于顶点着色器,有关于下一阶段不会读取的变化字段的警告.我怎样才能弄清楚将旧式代码改编为新代码?所以我对GLSL来说绝对是新手
由于某些原因,我正在将ZUI从SVG移植到WebGL,并且我想使用片段着色器渲染网格。
这是我要使用的基本效果https://dl.dropboxusercontent.com/u/412963/steel/restel_2.mp4
我想有一个三角形,每10个单位有1px的细线,每100个单位有2px的较粗的线(这里的单位是任意的,但与世界空间一致,而不与屏幕空间一致)。
这是我到目前为止的内容,没有视频中的第二粗线(请注意,这实际上是我打开的缓冲区的副本,显然是不对的):
顶点着色器:
attribute vec3 aVertexPosition;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying float vX;
varying float vY;
void main(void) {
vX = aVertexPosition.x;
vY = aVertexPosition.y;
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
precision mediump float;
uniform vec2 resolution;
uniform float uZoomFactor;
varying float vX;
varying float vY;
void main(void) {
float distance = gl_FragCoord.z / gl_FragCoord.w;
float fuzz = 1.0 / distance;
float minorLineFreq;
if (distance > 10.0) …Run Code Online (Sandbox Code Playgroud) 我正在寻找Unity的玻璃着色器,它只能折射它背后的物体,或者想要如何修改现有的玻璃着色器来做到这一点.
此屏幕截图显示了在曲面网格上使用FX/Glass/Stained BumpDistort时会发生什么.
如您所见,玻璃着色器折射网格前面的球体和网格后面的地面.我正在寻找一个只能折射它背后的物体的着色器.
以下是该着色器的代码,供参考:
// Per pixel bumped refraction.
// Uses a normal map to distort the image behind, and
// an additional texture to tint the color.
Shader "FX/Glass/Stained BumpDistort" {
Properties {
_BumpAmt ("Distortion", range (0,128)) = 10
_MainTex ("Tint Color (RGB)", 2D) = "white" {}
_BumpMap ("Normalmap", 2D) = "bump" {}
}
Category {
// We must be transparent, so other objects are drawn before this one.
Tags { "Queue"="Transparent" "RenderType"="Opaque" }
SubShader {
// This …Run Code Online (Sandbox Code Playgroud) 我正在尝试将自己的着色器用作SKSphaN的SKShader,但我只是不知道正确的方法.我想要的只是一种用自动完成来编写着色器代码的方法,并且可以看到着色器,而不必等待很长时间来编译它,但它似乎比我想象的更难.
我已经安装了GLFW3以及其他一些奇怪的东西,因为大多数教程都建议使用OpenGL这样的东西,但它似乎更多的是整个OpenGL,而不仅仅是一种特定的着色器.
TL; DR:有没有人知道在SpriteKit中编写着色器以用作SKShaders的快速而简单的方法?
fragment-shader ×10
glsl ×5
opengl ×4
shader ×4
opengl-es ×2
webgl ×2
3d ×1
c++ ×1
glew ×1
hlsl ×1
if-statement ×1
javascript ×1
skspritenode ×1
sprite-kit ×1
swift ×1