标签: fragment-shader

片段着色器模糊......这是如何工作的?

uniform sampler2D sampler0;
uniform vec2 tc_offset[9];
void blur()
{
  vec4 sample[9];
  for(int i = 0; i < 9; ++i)
    sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]);

  gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] +
      (2.0 * sample[3]) + sample[4] + 2.0 * sample[5] +
      sample[6] + 2.0 * sample[7] + sample[8] ) / 13.0;
}
Run Code Online (Sandbox Code Playgroud)

样本[i] = texture2D(sample0,...)行如何工作?

似乎模糊图像,我必须首先生成图像,但在这里,我在某种程度上试图查询我正在生成的iamge.这是如何运作的?

fragment-shader

3
推荐指数
2
解决办法
3080
查看次数

在片段着色器opengl中无法传递均匀的颜色

我正在使用openGL 3.1并使用QGL函数进行编程.我无法将统一的vec4 mycolor传递给片段着色器我使用以下命令初始化我的程序:

m_program = new QOpenGLShaderProgram(this);
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
m_program->link();
m_posAttr = m_program->attributeLocation("posAttr");
m_mycolor = m_program->uniformLocation("mycolor");
m_matrixUniform = m_program->uniformLocation("matrix");
Run Code Online (Sandbox Code Playgroud)

然后我尝试发送颜色

 GLfloat color[] = {
        0.0f, 1.0f, 0.0f, 1.0f    };
glUniform4fv(m_mycolor, 4, color);
Run Code Online (Sandbox Code Playgroud)

我的片段着色器是:

 static const char *fragmentShaderSource =
    "uniform vec4 mycolor;\n"
    "void main() {\n"
    "   gl_FragColor = mycolor;\n"
    "}\n";
Run Code Online (Sandbox Code Playgroud)

我什么也没看到

opengl fragment-shader

3
推荐指数
1
解决办法
6007
查看次数

在GLSL 150+中替换textureCube?

我想知道这个功能的替代品是什么.我是否只是将"texture"作为此函数调用的替代?或者有没有一种新方法可以做到这一点,不像120和之前?

这就是我现在所拥有的:

uniform samplerCube sampler;

[...]

fragColor = texture(sampler, centroi.xyz) * (ambient + specular + diffuse);
Run Code Online (Sandbox Code Playgroud)

opengl shader glsl fragment-shader

3
推荐指数
1
解决办法
2842
查看次数

使用2D纹理解决方法的WebGL/three.js中的3D纹理?

我想对我在WebGL中渲染的对象使用一些3D纹理.我正在片段着色器中使用以下方法,如WebGL和OpenGL上的建议差异:

// tex is a texture with each slice of the cube placed horizontally across the texture.
// texCoord is a 3d texture coord
// size is the size if the cube in pixels.

vec4 sampleAs3DTexture(sampler2D tex, vec3 texCoord, float size) {
   float sliceSize = 1.0 / size;                         // space of 1 slice
   float slicePixelSize = sliceSize / size;              // space of 1 pixel
   float sliceInnerSize = slicePixelSize * (size - 1.0); // space of size …
Run Code Online (Sandbox Code Playgroud)

opengl-es webgl fragment-shader three.js 3d-texture

3
推荐指数
1
解决办法
2873
查看次数

在OpenGL Fragment Shader中,gl_FragColor.a = 0和discard之间有什么区别?

标题为,gl_FragColor.a = 0应该使事物透明.丢弃的差异是什么?

对于以下代码

varying vec3 f_color; 
uniform sampler2D mytexture; 
varying vec2 texCoords;
float cutoff = 0.5;

void main(void) { 
  gl_FragColor = texture2D(mytexture,texCoords); 
  if( gl_FragColor.a < cutoff) discard;
}
Run Code Online (Sandbox Code Playgroud)

丢弃将工作,但如果我用gl_FragColor.a = 0替换丢弃; ,它没有效果.为什么?

opengl fragment-shader

3
推荐指数
1
解决办法
899
查看次数

将SSBO绑定到片段着色器

我有一个SSBO,它为屏幕上的每个像素存储vec4颜色值,并在主循环之前通过计算着色器预先填充值.

我现在正试图在屏幕上获取这些数据,我猜这涉及到使用片段着色器(虽然如果你知道一个更好的方法,我可以接受建议)

所以我试图将缓冲区或至少其中的数据添加到片段着色器中,以便我可以将每个片段的颜色设置为缓冲区中的相应值,但我找不到任何方法这样做?

有人告诉我,我可以将SSBO绑定到片段着色器,但我不知道该怎么做?我的其他想法是以某种方式将数据从SSBO移动到纹理,但我也无法解决这个问题

更新:

作为回应thokra的优秀答案和以下评论是设置我的缓冲区的代码:

//Create the buffer
GLuint pixelBufferID;
glGenBuffers(1, &pixelBufferID);

//Bind it
glBindBuffer(GL_SHADER_STORAGE_BUFFER, pixelBufferID);

//Set the data of the buffer
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(vec4) * window.getNumberOfPixels, new vec4[window.getNumberOfPixels], GL_DYNAMIC_DRAW);

//Bind the buffer to the correct interface block number
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pixelBufferID);
Run Code Online (Sandbox Code Playgroud)

然后我调用计算着色器,这部分工作,我检查数据是否已正确填充.然后在我的片段着色器中,就像测试一样:

layout(std430, binding=0) buffer PixelBuffer
{
    vec4 data[];
} pixelBuffer

void main()
{
    gl_FragColor = pixelBuffer.data[660000];
}
Run Code Online (Sandbox Code Playgroud)

我注意到的是,它似乎需要越来越长的索引越高,因此在660000它实际上并没有崩溃,只是花了很多时间.

opengl glsl compute-shader fragment-shader

3
推荐指数
1
解决办法
6272
查看次数

片段着色器会自动将颜色值限制在其范围内吗?

片段着色器会自动将颜色值限制在其范围内吗?

我需要显式地将着色器代码的值声明为蛤吗?如果不这样做,并且着色器自动进行钳位,是否意味着将节省一些处理时间?

opengl fragment-shader

3
推荐指数
1
解决办法
3548
查看次数

从texture()切换到texelFetch()

目前,我阅读具有以下功能的3D纹理texture(...)

vec3 value = texture(texture_3D, coord).rgb

我现在想做的是:

vec3 value = texelFetch(texture_3D, coord, 0).xyz

但是,我不知道如何转换坐标以使其与texelFetch一起使用。我的质地够大256x256x256

我当前的坐标计算如下:

vec3 min_box = vec3(-0.5);
vec3 max_box = vec3(0.5);

vec3 coord = worldToVolume(world_pos, min_box, max_box)

vec3 worldToVolume(world_pos, min_box, max_box) {
     return (world_pos - min_box) / (max_box - min_box)
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?如果您需要更多信息,请询问,我会提供。

c++ opengl shader glsl fragment-shader

3
推荐指数
1
解决办法
1814
查看次数

在片段着色器中创建渐变颜色

我正在努力实现像设计应用程序(例如Photoshop)那样制作渐变色,但无法获得我想要的确切结果.

我的着色器创建了非常漂亮的"渐变",但也包含与我想要切换的颜色不同的其他颜色.

它看起来不错,但我的目标是稍后添加混合功能并制作一种色彩校正着色器.但首先我必须得到正确的颜色.

这是我的片段着色器 http://player.thebookofshaders.com/?log=171119111216

uniform vec2 u_resolution;

void main() {

  vec2 st = gl_FragCoord.xy/u_resolution.xy;

  vec3 color1 = vec3(1.9,0.55,0);
  vec3 color2 = vec3(0.226,0.000,0.615);

  float mixValue = distance(st,vec2(0,1));
  vec3 color = mix(color1,color2,mixValue);

  gl_FragColor = vec4(color,mixValue);
}
Run Code Online (Sandbox Code Playgroud)

这是 着色器和设计应用程序中的结果比较

提前致谢..

glsl webgl fragment-shader

3
推荐指数
2
解决办法
8178
查看次数

SceneKit中的金属着色器勾勒出一个对象

我正在玩游戏并尝试在SceneKit中实现Metal Shader,它将勾勒出一个对象.

想法是绘制一个与此博客文章中的图像类似的轮廓(或轮廓)(博客文章不包含任何代码):

轮廓

我是SceneKit和Metal着色器的新手,所以我只能绘制一些几何体并编写简单的顶点或片段着色器.我很好奇我怎么能达到这种效果呢?它是在多次通过中完成的吗?

干杯!

shader fragment-shader ios scenekit metal

3
推荐指数
1
解决办法
634
查看次数