我正在寻找一种方法,用GLSL着色器绘制类似于这些"旋钮"的东西

我只想绘制彩色圆圈,我的应用程序不是用于旋钮而是一个时髦的进度表.是否可以通过使用着色器在平面多边形上绘制圆(或更具体的弧)?一个人如何开始这个过程?
我们在HLSL中有一个像素着色器,它在一些地方用于稍微不同的东西,因此有几个条件块意味着在某些情况下省略了复杂的功能.同样,这意味着我们将纹理作为采样器参数传递,而这些参数可能并不总是被使用.
我不知道这两件事增加了多少性能,但特别是因为我们在集成图形芯片上支持SM2.0,效率低下是个问题.那么,传递纹理而不使用它意味着任何额外的开销吗?并且使用if简单的行为来添加一些指令,还是会因为停顿等而对其进行大幅度的影响,就像进行CPU优化一样?
我最近一直在进行HLSL编程,我很好奇我正在做的一些事情是如何工作的.
例如,我在这里有一个非常简单的着色器,可以将任何蓝绿色的像素调整为红色.
sampler2D mySampler;
float4 MyPixelShader(float2 texCoords : TEXCOORD0): COLOR
{
float4 Color;
Color = tex2D(mySampler, texCoords.xy);
if(Color.r == 0 && Color.g == 1.0 && Color.b == 1.0)
{
Color.r = 1.0;
Color.g = 0.5;
Color.b = 0.5;
}
return Color;
}
technique Simple
{
pass pass1
{
PixelShader = compile ps_2_0 MyPixelShader();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道该tex2D函数在指定的位置抓取像素的颜色,但我不明白的是mySampler甚至有任何数据.我根本没有设置它或传入纹理,但它神奇地包含我的纹理数据.
另外,是什么样的东西之间的区别:
COLOR和COLOR0
或
TEXCOORD和TEXCOORD0
我可以采取合乎逻辑的猜测,并说这COLOR0是装配中的注册表,其中包含GPU中当前使用的像素颜色.(这可能完全错了,我只是陈述我的想法)
如果是这样,这是否意味着指定类似float2 texCoords : TEXCOORD0意志的东西,默认情况下,抓住GPU正在处理的当前位置?
我正在为带有AMD Radeon HD 6970M 2048 MB显卡的iMac编写GLSL顶点着色器:
GL_MAX_VERTEX_ATTRIBS: 16
GL_MAX_VERTEX_UNIFORM_COMPONENTS: 4096
GL_VERSION: 2.1 ATI-7.12.9
GL_SHADING_LANGUAGE_VERSION: 1.20
Run Code Online (Sandbox Code Playgroud)
在我的着色器中,我想要一大堆均匀的mat4s:
uniform mat4 T[65]
Run Code Online (Sandbox Code Playgroud)
但如果我尝试将65个这样的着色器(秘密地)切换到Apple Software Renderer模式.如果我改为使用64:
uniform mat4 T[64]
Run Code Online (Sandbox Code Playgroud)
一切都好.
似乎是超过最大制服数量的问题.但正如我上面写的那样,GL_MAX_VERTEX_UNIFORM_COMPONENTS为4096 /(4*4)= 256而不是64 ...
ATI/AMD注意:ATI最大组件值是错误的.它们是实际的组件数除以4.
但是读到这个我会认为如果我查询GL_MAX_VERTEX_UNIFORM_COMPONENTS并得到4096,那我实际上有16,384.似乎是这样的情况是GL_MAX_VERTEX_UNIFORM_COMPONENTS返回实际的组件数乘以 4.这将得到1024 /(4*4)= 64.
谁能证实这一点?
编辑: 我的着色器很简单:
#version 120
// 65 goes into software render mode
#define MAX_T 64
attribute vec4 indices;
uniform mat4 T[MAX_T];
void main()
{
gl_Position = T[int(indices[0])]*gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud) 我试图运行100000和更多的粒子.我一直在观看很多教程和其他展示着色器和OpenCL强大功能的例子.
在我观察的一个例子中,粒子的位置是根据鼠标指针的位置计算的(用一只手握住的物理设备和光标在屏幕上).每个粒子的位置存储为RGB.R是x,G y和B,z.并传递给像素着色器.然后将每个颜色像素绘制为粒子的位置.
但是我对这种方法感到很荒谬.
我正在学习OpenGL ES 2.0,我想创建一个应用程序来更好地理解它是如何工作的.该应用程序有一组用户可以应用于图像的过滤器(我知道,没什么新的:P).
其中一个过滤器需要两个图像和一个蒙版,它会混合显示它们的两个图像(这里是一个图像,以便更好地解释我想要获得的内容)

目前我真的很困惑,我不知道从哪里开始创造这种效果.我无法理解我必须使用多个纹理和多个FrameBuffers,或者我可以使用单个着色器.
你有什么提示可以帮助我做这个项目吗?
编辑 - - - -
我已经找到了这个解决方案,但是当我用作遮罩线而不是圆圈时,结果实际上是"蹩脚",特别是如果线条被旋转.
precision highp float;
varying vec4 FragColor;
varying highp vec2 TexCoordOut;
uniform sampler2D textureA;
uniform sampler2D textureB;
uniform sampler2D mask;
void main(void){
vec4 mask_color = texture2D(mask, TexCoordOut);
if (mask_color.a > 0.0){
gl_FragColor = texture2D(textureA, TexCoordOut);
}else {
gl_FragColor = texture2D(textureB, TexCoordOut);
}
}
Run Code Online (Sandbox Code Playgroud)
使用Stencil缓冲区或混合可能更好吗?
我正在尝试编写现代的OpenGL,但是遇到了一些让我烦恼的东西.
我有这段代码:
glUseProgram(skybox_program->id);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->id);
glUniform1i(get_program_uniform(skybox_program, "cubemap_tex"), 1);
//From here
GLint save_cull_mode, save_depth_mode;
glGetIntegerv(GL_CULL_FACE_MODE, &save_cull_mode);
glGetIntegerv(GL_DEPTH_FUNC, &save_depth_mode);
glCullFace(GL_FRONT);
glDepthFunc(GL_LEQUAL);
//To here
glUniformMatrix4fv(get_program_uniform(skybox_program, "camera"), 1, GL_FALSE, cam_rot.mat);
glBindVertexArray(skybox_vao);
glDrawArrays(GL_TRIANGLES, 0, 6 * 2 * 3);
//And these next 2 lines
glCullFace(save_cull_mode);
glDepthFunc(save_depth_mode);
glUseProgram(0);
Run Code Online (Sandbox Code Playgroud)
正如您可能已经意识到的那样,此代码绘制了一个天空盒.部分原因是禁用剔除(所以我们可以在里面看到方框)并更改深度功能(基本上是优化,其中一部分在着色器中,部分在此处).我想保存并恢复这些值,但由于我无法使用gl[Push/Pop]Attrib,我必须自己做.这对于两个属性来说并不是什么大不了的事,但如果我使用更多属性,这很快就会变成一个巨大的痛苦(而且,据我所知,速度glGet*很慢,因为速度不是很快).我读到推送/弹出功能已被弃用,因为它们主要用于处理FFP状态,但这显然不是FFP状态,但推/弹功能非常适合使用.我应该用什么呢?或者我必须处理它?
这个问题与使用着色器有关(可能在Unity3D环境中,但是Metal或OpenGL很好),
在网格最小的立方体上实现圆形边缘.

我只想使用12个三角形的极简主义网格立方体,
然后通过着色器,
实现每个块的边缘(/角)略微倾斜.
事实上,这可以用着色器完成吗?
谢谢,着色大师!
我做了一个简单的实验,通过实现naive char搜索算法,在CPU和GPU上使用iOS8 Metal计算管道搜索每行50个字符(50 mil字符映射)的1.000.000行.
CPU实现使用简单的循环,Metal实现给每个内核1行进行处理(下面的源代码).
令我惊讶的是,Metal实现平均比简单的线性CPU(如果我使用1个核心)慢2-3倍,如果我使用2个核心(每个都搜索一半数据库),则慢3-4倍!我尝试了每组不同的线程(16,32,64,128,512)但仍然得到非常相似的结果.
iPhone 6:
CPU 1 core: approx 0.12 sec
CPU 2 cores: approx 0.075 sec
GPU: approx 0.35 sec (relEase mode, validation disabled)
Run Code Online (Sandbox Code Playgroud)
我可以看到Metal shader花费超过90%的访问内存(见下文).
可以做些什么来优化它?
任何见解都将受到赞赏,因为互联网上没有太多来源(除了标准的Apple编程指南),提供有关内存访问内部的详细信息以及特定于Metal框架的权衡.
金属实施细节:
主机代码要点:https: //gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d
内核(着色器)代码:https: //gist.github.com/lukaszmargielewski/6b64d06d2d106d110126
GPU帧捕获分析结果:

我目前正在使用MeshPhongMaterialThree.js提供的基本水创建一个简单的场景.我希望水材料具有Hard Light可在Photoshop等应用程序中找到的混合模式.如何Hard Light在右侧实现下面的混合模式?
上面图像的右半部分设置为Hard LightPhotoshop.我试图Hard Light在Three.js中重新创建混合模式.
我遇到的一个主要是完全重新实现了MeshPhongMaterial片段和顶点着色器,但这需要一些时间,因为我对此很新.
在Three.js中为材质实现混合模式的方法是什么Hard Light?
/*
* Scene config
**/
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 10000);
var renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setClearColor(0xffffff);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.set(0, 500, 1000);
camera.lookAt(scene.position);
/*
* Scene lights
**/
var spotlight = new THREE.SpotLight(0x999999, 0.1);
spotlight.castShadow = true;
spotlight.shadowDarkness = 0.75;
spotlight.position.set(0, 500, …Run Code Online (Sandbox Code Playgroud)shader ×10
opengl ×4
glsl ×3
hlsl ×2
ati ×1
c ×1
c# ×1
c++ ×1
deprecated ×1
ios ×1
javascript ×1
metal ×1
opencl ×1
opengl-3 ×1
performance ×1
pixel-shader ×1
rendering ×1
three.js ×1
webgl ×1
xna ×1