Articles of 着色器

为什么用w除以使像素着色器看起来更好?

我在HLSL(使用SharpDX的Direct3D11)中编写了一个着色器,经过一些计算,我试图做一个testing,并在像素着色器中打印特定点的深度z,如下所示: myZ = input.pz; color = float4(myZ, myZ, myZ, 1.0f); return color; 这个结果是我期望的结果,但是虽然我看到了我所期望的(像素越深,当它们离我们越来越近的时候越来越近),我必须将相机移近模型以开始看到一些较暗的像素。 如果不是,一切都是白色的。 事情是,如果我这样做,而是在一些论坛上读到: myZ = input.pz/input.pw; color = float4(myZ, myZ, myZ, 1.0f); return color; 那么我可以从一开始就看到更好的东西。 问题是我不明白这背后的逻辑。 为什么这会有所帮助,为什么它会有意义。 任何帮助表示感谢,谢谢!

当方圆太高,我的模糊变得难看

我有以下h和v模糊: HORZ texture tex; sampler2D s = sampler_state { texture = <tex>; }; int tWidth; int tHeight; float blurSize = 9.0; float4 ps_main(VS_OUTPUT Input) : COLOR0 { float2 pxSz = float2(1.0 / tWidth,1.0 / tHeight); float4 outC = 0; outC += Input.Color * tex2D(s, Input.TexCoord.xy + float2(-4.0 * pxSz.x * blurSize,0)) * 0.05; outC += […]

如何在Shader中混合像素颜色?

我有一个RGB颜色的像素。 这个颜色是由着色器计算的,可以是任何东西。 我如何用我select的颜色来覆盖这个颜色。 如果我的像素是白色的,那很简单,我可以这样做: half3 original = half3(1, 1, 1); half3 mycolor = half3(1, 0, 0); half3 result = original * mycolor; 但是,我能做什么,如果: half3 original = half3(0.36, 0.74, 0.18); half3 mycolor = half3(1, 0, 0); half3 result = ?; 我应该对我的原始像素颜色应用什么操作或function来覆盖它?

在自定义游戏引擎中,与所有graphics实体着色器共享投影matrix和视图matrix的最佳方法是什么?

在自定义游戏引擎中,与所有graphics实体着色器共享投影matrix和视图matrix的最佳方法是什么? 参照graphics实体具有glUseProgram({shader_program_id}); glDrawArrays(GL_XXXX, x); glUseProgram({shader_program_id}); glDrawArrays(GL_XXXX, x); 我的想法之一是有一个相机对象,管理当前的视图和投影matrix。 然后,我将相机对象的引用传递给所有的实体。 但是,我的问题是在切换视图时,将所有实体/对象的当前相机同步。 但是,我可以让相机成为全球性的,这可能会有很多问题。

在缓冲和定义VBO数据时,是否需要“使用”着色器程序?

我试图围绕着一个GL“程序”,VAO,缓冲区,纹理等之间的关系。我不太清楚何时需要“使用”我的着色器程序,以及何时)我需要“不使用”吗? 那么我什么时候需要使用着色器程序(即调用glUseProgram )呢? 在以下情况下,我的着色器程序是否需要“使用”? 创建和绑定VAO? 创建和绑定VBOs? 将数据caching到VBO? 定义顶点属性(即调用glVertexAttribPointer )?

哪个代码更快将-1转换为0和1?

我正在写一个着色器来呈现不同颜色的三角形的边。 我有一个价值mediump float back = dot(V, N) ,这是正面的,如果法线背离相机,负面,如果朝着相机。 要正确select哪个漫reflection颜色来遮蔽特定的片段,我需要这样的东西: lowp vec4 color = max(0.0, sign(-back)) * frontdiffuse + max(0.0, sign(back)) * back diffuse; 这或多或less是一个“展开的条件”… 哪个代码能产生更快的指令 x * 0.5 + 0.5 ,或者 max(0.0, x) ? 前者在math上可能比后者更好,但是最小/最大/钳位在硬件上是超高效的

在GLSL中完全呈现3D环面形状

我想知道,是否有可能完全呈现一个(三维)圆环形状在GLSL,即不使用顶点/索引数组? 欢迎提出建议,谢谢。

Shader程序在Ati上编译得很好,在其他供应商上失败

这里有一个真正烦人的问题。 我的着色器程序编译我的Ati Radeon高清卡,但在Nvidia和英特尔它无法编译。 顶点着色器: #version 120 attribute vec3 in_position; attribute vec3 in_normal; attribute vec3 in_texcoord; uniform mat4 modelMatrix; uniform mat4 viewMatrix; uniform mat4 projMatrix; varying vec2 texture_coordinate; varying vec3 normal; void main() { gl_Position = (projMatrix * viewMatrix * modelMatrix) * vec4(in_position, 1.0); normal = in_normal; texture_coordinate = in_texcoord.xy; } 片段着色器: #version 120 varying vec2 […]

如何debuggingGLSL着色器?

我无法在Google和Youtube上find任何教程。 我有一个C ++程序,使用OpenGL ES 2.0 API在屏幕上显示一些东西。 我怎样才能debugging我的着色器? 任何一步一步的指导? 什么是最简单的方法,至less打印variables值?

OpenGL ES 2.0和地图集

我正在尝试从OpenGL ES 2.0的纹理地图集中绘制元素 目前,我在着色器中使用这样的东西来绘制我的元素: uniform mat4 uCamera; uniform mat4 uModel; attribute vec4 aPosition; attribute vec4 aColor; attribute vec2 aTextCoord; uniform vec2 offset; uniform vec2 scale; varying lowp vec4 vColor; varying lowp vec2 vUV; void main() { vUV = offset + aTextCoord * scale; gl_Position = (uCamera * uModel) * aPosition; vColor = aColor; } 对于每个要绘制的元素,我发送它的偏移量和比例到着色器。 […]