Articles of glsl

几何着色器和三角形邻接

我目前正在尝试改变我的项目使用GL_TRIANGLE_ADJACENCY而不是GL_TRIANGLES。 在这个问题之后,我设法建立了我的索引缓冲区,但是在绘图阶段,我得到了意想不到的结果。 这是我的几何着色器代码。 记住,我存储我的索引是这样的: ( vertex1/adjacent1/vertex2/adjacent2/vertex3/adjacent3 ) 几何着色器 #version 330 precision highp float; layout (triangles_adjacency) in; layout (triangle_strip, max_vertices = 3) out; smooth in vec2 vVaryingTexCoords[]; smooth in vec3 vVaryingNormals[]; smooth out vec2 gsUV; smooth out vec3 gsNormals; void main(void) { int i; for(i = 0; i < gl_in.length(); i++) { switch(i) { case 0: […]

凹凸贴图问题GLSL

我的凹凸映射项目有一个小问题。 虽然一切正常(至less从我所知道的情况来看),但是在某个地方会有一些小小的错误,当灯光照到一边或另一边时,我会在砖墙上看到不正确的阴影,如下图所示: 光在右侧,所以墙上的阴影应该是另一种方式。 我提供了着色器来帮助find问题(我没有太多的着色器经验)。 着色器: varying vec3 viewVec; varying vec3 position; varying vec3 lightvec; attribute vec3 tangent; attribute vec3 binormal; uniform vec3 lightpos; uniform mat4 cameraMat; void main() { gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); position = vec3(gl_ModelViewMatrix * gl_Vertex); lightvec = vec3(cameraMat * vec4(lightpos,1.0)) – position ; vec3 eyeVec = vec3(gl_ModelViewMatrix * gl_Vertex); viewVec […]

HLSL如何处理剪辑(vector)?

我的目标是将clip()转换为1.5版本的GLSL。 我目前正在做一个基本的: if (x < 0) discard; 但是如果x不是标量,显然我不能使用“<”运算符。 所以我想知道HLSL究竟是如何处理剪辑函数中的vector(或matrix),所以我可以解释这些。 任何资源将不胜感激,因为我找不到任何有关该function的详细信息。 谢谢!

在GLSL中查看正常计算

对不起,可怕的标题,但我真的不能想到更好的。建议表示欢迎。 我正在尝试在video中展示如下内容: 所以基本上可以顺利地改变面貌时的不透明度。 这是我的顶点着色器,片段着色器很简单,因为它只是将lightColor与纹理相乘: #version 430 core uniform mat4 MV; uniform mat4 MVP; layout(location = 0) attribute vec3 vertexPosition; layout(location = 1) attribute vec2 vertexUV; layout(location = 2) attribute vec3 vertexNormal; layout(location = 3) attribute mat4 bufferMatrix; // For per-instance translation varying vec2 UV; varying vec4 lightColor; flat varying int InstanceID; void main(){ vec4 mcPosition […]

病房模型实现:镜面组件太弱

我试图实现Ward着色模型,各向异性,计算效率高的版本: 这是我做到的: float alphaX=0.5, alphaY=0.5; // asinotropic roughness float minFloat= 1.e-6; vec4 Ward(vec3 L, vec3 N, vec3 V) { vec3 H= normalize(L+V); float NdotL= max(dot(N,L),0.0); float NdotV= max(dot(N,V),0.0); vec3 e= vec3(1.0,0.0,0.0); vec3 T= normalize(cross(N,e)); vec3 B= normalize(cross(N,T)); float HdotT= max(dot(H,T),0.0); float HdotB= max(dot(H,B),0.0); float HdotN= max(dot(H,N),0.0); float beta= -2.0 * ( pow(HdotN/alphaX, 2.0) + pow(HdotB/alphaY,2.0) […]

告诉我的着色器何时使用哪个纹理

所以我设法通过GLSL着色器进行纹理化,我可以通过一个sampler2d textureHandler +我的uv坐标到我的着色器来指定要在我的Tiles上显示的纹理。 现在即时通讯想知道如何可以定义哪个瓷砖应该得到哪个纹理原因,现在我只能把所有的瓷砖1单纹理我有… 我的顶点着色器: in vec3 position; in vec2 vertexUV; uniform mat4 orthoMatrix; out vec2 UV; void main() { gl_Position = orthoMatrix * vec4(position, 1.0); UV = vertexUV; } 我的片段着色器: in vec2 UV; out vec4 outColor; uniform sampler2D myTextureSampler1; void main() { outColor = texture2D(myTextureSampler1, UV); } 我的纹理加载现在看起来像这样: http : //puu.sh/62MhS.png

间接索引(从纹理读取的uv坐标)

在顶点着色器中,我需要进行纹理获取,其中纹理坐标本身是从其他纹理读取的。 vec2 uv = texture(someTexture,coords).xy; vec4 val = texture(otherTexture,uv).xyzw; 据我所知,第二个样本有未定义的结果,因为uv的值在统一stream量控制之外。 有没有办法有效地(即,不复制纹理的内容,并将其作为制服上传到着色器或其他东西)做我想做的事情?

GLSL关联多个统一的采样器缓冲区

目前我不确定我的VBO和TBO如何与我的着色器中的特定的统一采样器缓冲区相关联,我没有将它们与位置或vbo / tbo联系在一起。 它似乎仍然工作,但现在,我正在使用多个samplerbuffers,如何建立连接特定的TBO和制服。 我需要使用glUniformX吗?

GLSL – std140均匀块 – 场(vec,float,mat4)总是0.0

好, 首先,如果只是使用制服,就应该这样做。 切换到统一块没有任何变化,因为所有的值都是0.0。 我在顶点着色器中用各种if-then-else的东西testing了这个,并修改了输出的颜色。 根据CodeXL 1.3(这里的数据被列为VBO,但我认为这只是表面化),GL.BindBuffer与GL.MapBuffer,或GL.GetBufferSubData真的是我的ubo内的正确的数据,但仍然在统一块着色器仅包含0.0。 工作stream程: //Create UBO BufferUBOName = new int[2]; GL.GenBuffers(2, BufferUBOName); // Generate the buffer BufferIndex = 0; GL.BindBuffer(BufferTarget.UniformBuffer, BufferUBOName[0]); // Bind the buffer for writing GL.BufferData(BufferTarget.UniformBuffer, (IntPtr)uboWorldData.SizeInBytes, IntPtr.Zero, BufferUsageHint.StreamDraw); // Request the memory to be allocated GL.BindBufferRange(BufferRangeTarget.UniformBuffer, BufferIndex, BufferUBOName[0], IntPtr.Zero, (IntPtr)uboWorldData.SizeInBytes); // Bind the created Uniform Buffer to the Buffer […]

是否可以使用GLES2 GLSL片段着色器的非标准化纹理坐标?

我想从我的GLES2 GLSL 片段着色器使用非标准化的纹理坐标(0-w,0-h而不是GLES2查找纹理GLES2 。 原因是这个纹理被用作查找表,我得到了标准化坐标的精度 问题 。 我发现GL_TEXTURE_RECTANGLE不支持扩展名,也不支持texelFetch() ,所以我排除了这些选项。 谢谢!