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.这是如何运作的?
我正在使用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)
我什么也没看到
我想知道这个功能的替代品是什么.我是否只是将"texture"作为此函数调用的替代?或者有没有一种新方法可以做到这一点,不像120和之前?
这就是我现在所拥有的:
uniform samplerCube sampler;
[...]
fragColor = texture(sampler, centroi.xyz) * (ambient + specular + diffuse);
Run Code Online (Sandbox Code Playgroud) 我想对我在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) 标题为,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替换丢弃; ,它没有效果.为什么?
我有一个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它实际上并没有崩溃,只是花了很多时间.
片段着色器会自动将颜色值限制在其范围内吗?
我需要显式地将着色器代码的值声明为蛤吗?如果不这样做,并且着色器自动进行钳位,是否意味着将节省一些处理时间?
目前,我阅读具有以下功能的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)
有任何想法吗?如果您需要更多信息,请询问,我会提供。
我正在努力实现像设计应用程序(例如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)
提前致谢..
我正在玩游戏并尝试在SceneKit中实现Metal Shader,它将勾勒出一个对象.
想法是绘制一个与此博客文章中的图像类似的轮廓(或轮廓)(博客文章不包含任何代码):
我是SceneKit和Metal着色器的新手,所以我只能绘制一些几何体并编写简单的顶点或片段着色器.我很好奇我怎么能达到这种效果呢?它是在多次通过中完成的吗?
干杯!