Tag: 着色器

将纹理(绘制为平面3D对象)转换为模拟深度时,黑线会随机出现

我们正在使用XNA开发一个自顶向下的RPG游戏。 最近我们在编写代码来显示我们的地图时遇到了挫折。 在绘制地图时,用正常的变换matrix进行自顶向下的视图,一切似乎都很好。 当使用非平坦变换matrix(如顶部或底部挤压模拟深度)时,会出现相机更改位置时移动的黑色线(顶部或底部的行,左侧或右侧的列被挤压)。 移动和放置似乎是随机的。 (图片进一步向下。) 背景信息 地图由瓷砖组成。 原始纹理包含32×32像素的图块。 我们通过创build2个三angular形并在这些三angular形上显示原始纹理的一部分来绘制图块。 着色器为我们做这个。 有三层三angular形。 首先,我们绘制所有半透明和部分透明的瓷砖的所有不透明的瓷砖和所有不透明的像素,然后绘制所有半透明和部分透明的瓷砖和像素。 这工作正常(但是,当我们缩放浮点因子,有时颜色混合线位于瓷砖行和/或列之间)。 绘制状态 我们对所有拼贴使用相同的rasterizerState,并且在绘制纯色或半透明拼贴时我们在两个之间切换。 _rasterizerState = new RasterizerState(); _rasterizerState.CullMode = CullMode.CullCounterClockwiseFace; _solidDepthState = new DepthStencilState(); _solidDepthState.DepthBufferEnable = true; _solidDepthState.DepthBufferWriteEnable = true; _alphaDepthState = new DepthStencilState(); _alphaDepthState.DepthBufferEnable = true; _alphaDepthState.DepthBufferWriteEnable = false; 在阴影中,我们设置SpriteBlendMode如下: 第一固体层1使用 AlphaBlendEnable = False; SrcBlend = One; DestBlend = Zero; 所有其他固体和透明层(稍后绘制)使用 […]

GLSL / C ++:制服arrays?

我想离开OpenGL的灯光,做我自己的。 我希望我的着色器允许可变数量的灯光。 我们可以在GLSL着色器中声明一系列的制服吗? 如果是的话,我们如何设定这些制服的价值呢?

什么是顶点和像素着色器?

什么是顶点和像素着色器? 他们有什么区别? 哪一个是最好的?

这个GLSL rand()单线程的起源是什么?

我已经看到这个伪随机数发生器用于在这里和那里提到的着色器周围的networking : float rand(vec2 co){ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); } 它被称为“规范”,或者“我在网上find的一行代码”。 这个function的起源是什么? 这些不变的价值观是否随意,或者是否有一些艺术可供select? 有没有关于这个function的优点的讨论? 编辑:这个function的最古老的引用,我已经遇到这个从2008年2月的档案 ,原来的网页现在正在从网上消失。 但是除此之外,没有更多的讨论。

什么是GLSL着色器的正确文件扩展名?

我正在学习glsl着色,并且遇到了不同的文件格式。 我看到有人给他们的顶点和片段着色器.vert和.frag扩展名。 但是我也看到.vsh和.fsh扩展名,甚至两个着色器都放在一个.glsl文件中。 所以我想知道是否有一个标准的文件格式,或者哪个方法是“正确”的?

从深度缓冲区获得真正的z值

如预期,从着色器中的深度缓冲区采样返回值介于0和1之间。 鉴于相机的近平面和远平面,我该如何计算真实的z值,即距相机的距离?

什么是在4.1版本的OpenGL中进行文本渲染的最新技术?

在OpenGL中已经有很多关于文本渲染的问题,比如: 如何做一个GUI的OpenGL生活文字渲染? 但是大部分讨论的是使用固定functionstream水线渲染纹理四边形。 着色器必须做出更好的方法。 我并不十分关心国际化,我的大部分string都是绘图标记(date和时间或纯数字)。 但是这些图将以屏幕刷新率重新渲染,并且可能有相当多的文本(屏幕上不超过几千个字形,但硬件加速布局足够好)。 使用现代OpenGL进行文本渲染的build议方法是什么? (使用这种方法引用现有的软件是很好的证据,表明它运行良好) 几何着色器接受例如位置和方向以及字符序列并发出纹理四边形 呈现vector字体的几何着色器 如上所述,但使用曲面细分着色器 一个计算着色器来做字体光栅化

使用ShaderMaterial复制MeshLambertMaterial将忽略纹理

我注意到THREE.js在内部使用着色器来创build核心材质,例如MeshLambertMaterial,所以我决定将Three.js代码中的lambert着色器复制到一个新的着色器中并在其上构build。 这是我得到的代码(从Three.js r66忠实复制) THREE.MyShader = { uniforms: THREE.UniformsUtils.merge( [ THREE.UniformsLib[ "common" ], THREE.UniformsLib[ "fog" ], THREE.UniformsLib[ "lights" ], THREE.UniformsLib[ "shadowmap" ], { "ambient" : { type: "c", value: new THREE.Color( 0xffffff ) }, "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) }, "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 […]

OpenGL着色器的显式和自动属性位置绑定

为OpenGL着色器程序设置属性位置时,您面临两个select: 链接之前glBindAttribLocation()明确定义一个属性位置。 要么 glGetAttribLocation()链接后获得一个自动分配的属性位置。 使用其中一个的效用是什么? 如果有,哪一个在实践中是首选的?

射线和椭球相交准确度的提高

我需要在我的一个大气散射GLSL片段着色器中提高函数的精度,这个片段着色器计算单个光线和轴alignment的椭球之间的交点。 这是矿井大气散射着色器的核心function。 旧的原始着色器是在floats和正常渲染是好的,但增加缩放后,我发现,相对较小的距离精度丢失。 在浮标上,地球的可用距离只有0.005AU(天文单位)。 所以我试图移植的关键functiondouble ,这有助于现在可用的距离大约1.0 AU(具有小的文物) 这是Fragment Shader内部函数的double版本(旧式源代码使用不赞成的东西!!!) #extension GL_ARB_gpu_shader_fp64 : enable double abs(double x) { if (x<0.0) x=-x; return x; } // compute length of ray(p0,dp) to intersection with ellipsoid((0,0,0),r) -> view_depth_l0,1 // where rx is elipsoid rx^-2, ry = ry^-2 and rz=rz^-2 float view_depth_l0=-1.0,view_depth_l1=-1.0; bool _view_depth(vec3 _p0,vec3 _dp,vec3 _r) { double a,b,c,d,l0,l1; […]