标签: shader

openGL GLSL着色器:在平面多边形上绘制一个圆

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

替代文字

我只想绘制彩色圆圈,我的应用程序不是用于旋钮而是一个​​时髦的进度表.是否可以通过使用着色器在平面多边形上绘制圆(或更具体的弧)?一个人如何开始这个过程?

opengl shader glsl

11
推荐指数
2
解决办法
8480
查看次数

条件和未使用的采样器/纹理添加到SM2/3像素着色器的性能有多大?

我们在HLSL中有一个像素着色器,它在一些地方用于稍微不同的东西,因此有几个条件块意味着在某些情况下省略了复杂的功能.同样,这意味着我们将纹理作为采样器参数传递,而这些参数可能并不总是被使用.

我不知道这两件事增加了多少性能,但特别是因为我们在集成图形芯片上支持SM2.0,效率低下是个问题.那么,传递纹理而不使用它意味着任何额外的开销吗?并且使用if简单的行为来添加一些指令,还是会因为停顿等而对其进行大幅度的影响,就像进行CPU优化一样?

shader rendering hlsl pixel-shader

11
推荐指数
1
解决办法
6520
查看次数

一些简单的XNA/HLSL问题

我最近一直在进行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甚至有任何数据.我根本没有设置它或传入纹理,但它神奇地包含我的纹理数据.

另外,是什么样的东西之间的区别: COLORCOLOR0TEXCOORDTEXCOORD0

我可以采取合乎逻辑的猜测,并说这COLOR0是装配中的注册表,其中包含GPU中当前使用的像素颜色.(这可能完全错了,我只是陈述我的想法)

如果是这样,这是否意味着指定类似float2 texCoords : TEXCOORD0意志的东西,默认情况下,抓住GPU正在处理的当前位置?

c# shader xna hlsl

11
推荐指数
1
解决办法
1870
查看次数

ATI显卡上GLSL着色器的顶点均匀组件的实际数量是多少?

我正在为带有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 ...

OpenGL.org维基

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)

opengl shader glsl ati

11
推荐指数
1
解决办法
4228
查看次数

(渲染粒子)我应该学习着色器还是OpenCL?

我试图运行100000和更多的粒子.我一直在观看很多教程和其他展示着色器和OpenCL强大功能的例子.

在我观察的一个例子中,粒子的位置是根据鼠标指针的位置计算的(用一只手握住的物理设备和光标在屏幕上).每个粒子的位置存储为RGB.R是x,G y和B,z.并传递给像素着色器.然后将每个颜色像素绘制为粒子的位置.

但是我对这种方法感到很荒谬.

  • 是不是要避免使用这种方法或编码风格?
  • 我不知道如何使用OpenCL并使用GPU多线程的强大功能来直接说明并传递我想要的代码吗?

c++ opengl shader opencl

11
推荐指数
1
解决办法
1823
查看次数

OpenGL ES 2.0中的图像和掩码

我正在学习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缓冲区或混合可能更好吗?

shader opengl-es-2.0

11
推荐指数
1
解决办法
6764
查看次数

由于不推荐使用glPushAttrib/glPopAttrib,保存GL_DEPTH_FUNC等属性的新方法是什么?

我正在尝试编写现代的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状态,但推/弹功能非常适合使用.我应该用什么呢?或者我必须处理它

c opengl shader deprecated opengl-3

11
推荐指数
1
解决办法
4486
查看次数

着色器斜切多维数据集的边缘?

这个问题与使用着色器有关(可能在Unity3D环境中,但是Metal或OpenGL很好),

在网格最小的立方体上实现圆形边缘.

在此输入图像描述

  • 我只想使用12个三角形的极简主义网格立方体,

  • 然后通过着色器,

  • 实现每个块的边缘(/角)略微倾斜.

事实上,这可以用着色器完成吗?

谢谢,着色大师!

shader unity-game-engine

11
推荐指数
1
解决办法
5999
查看次数

iOS Metal计算管道比搜索任务的CPU实现慢

我做了一个简单的实验,通过实现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帧捕获分析结果:

在此输入图像描述

performance shader ios metal

11
推荐指数
1
解决办法
2026
查看次数

Three.js中的硬光材料混合模式?

我目前正在使用MeshPhongMaterialThree.js提供的基本水创建一个简单的场景.我希望水材料具有Hard Light可在Photoshop等应用程序中找到的混合模式.如何Hard Light在右侧实现下面的混合模式?

比较我拥有的和期望的最终结果 Photoshop的普通和硬光混合模式的比较

上面图像的右半部分设置为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)

javascript shader glsl webgl three.js

11
推荐指数
1
解决办法
1758
查看次数