标签: glsl

在GLSL中外部定义预处理器宏

GLSL有一个完整的C风格预处理器.唯一不起作用的是#include.其中一个很棒的功能是,您可以使用#ifdef注释掉函数,从而创建一个着色器,如果不使用某些特征,可以将其稀疏.

我的问题是:

有没有办法从C代码定义宏?

使用openGL接口似乎无法做到这一点.快速入侵是在代码加载表单文件之前使用#define FOO添加几行.但它似乎有点倒退.

opengl preprocessor glsl

21
推荐指数
2
解决办法
1万
查看次数

在OpenGL 3.2中绘制全屏四边形的最佳方法是什么?

我在片段着色器中进行光线投射.为了这个目的,我可以想出几种方法来绘制全屏四边形.在投影矩阵设置为单位矩阵的情况下在剪辑空间中绘制四边形,或使用几何着色器将点转换为三角形条带.前者使用立即模式,在OpenGL 3.2中弃用.后者我使用了新颖性,但它仍然使用立即模式来说明一点.

opengl glsl

21
推荐指数
6
解决办法
3万
查看次数

GLSL中的多个纹理 - 只有一个有效

我的问题是在GLSL着色器中可以访问多个纹理.这是我正在做的事情:

着色器:

uniform sampler2D sampler0;
uniform sampler2D sampler1;
uniform float blend;
void main( void )
{
    vec2 coords = gl_TexCoord[0];
    vec4 col = texture2D(sampler0, coords);
    vec4 col2 = texture2D(sampler1, coords);
    if (blend > 0.5){
        gl_FragColor = col;
    } else {
        gl_FragColor = col2;
    }
};
Run Code Online (Sandbox Code Playgroud)

因此,我只需根据统一变量在两个颜色值之间进行选择.足够简单(这是一个测试),但是当混合<= 0.5时,我得到全黑,而不是预期的行为.

OpenGL代码:

m_sampler0location = m_shader.FindUniform("sampler0");
m_sampler1location = m_shader.FindUniform("sampler1");
m_blendlocation = m_shader.FindUniform("blend");

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler0location, 0);
glBindTexture(GL_TEXTURE_2D, Texture0.Handle);  
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler1location, 1);
glBindTexture(GL_TEXTURE_2D, Texture1.Handle);
glBegin(GL_QUADS);
    //lower left
    glTexCoord2f(0, 0);
    glVertex2f(-1.0, -1.0);
    //upper left …
Run Code Online (Sandbox Code Playgroud)

opengl textures glsl

21
推荐指数
3
解决办法
4万
查看次数

GLSL gl_FragCoord.z计算和设置gl_FragDepth

所以,我有一个冒名顶替者(真正的几何体是一个立方体,可能被修剪,冒名顶的几何体是Menger海绵),我需要计算它的深度.

我可以相当容易地计算出在世界空间中抵消的金额.不幸的是,我花了好几个小时没有用它来扰乱深度.

我能得到的唯一正确结果是我去的时候:

gl_FragDepth = gl_FragCoord.z
Run Code Online (Sandbox Code Playgroud)

基本上,我需要知道如何计算gl_FragCoord.z,以便我可以:

  • 从gl_FragCoord.z到眼睛空间进行逆变换
  • 添加深度扰动
  • 将这个扰动的深度转换回与原始gl_FragCoord.z相同的空间.

如果这似乎是一个重复的问题,我道歉; 这里有很多其他帖子可以解决类似问题.但是,在实现所有这些之后,没有一个正常工作.而不是试图选择一个来获得帮助,此时,我要求完整的代码来完成它.它应该只是几行.

opengl shader glsl

21
推荐指数
2
解决办法
1万
查看次数

GL_ARRAY_BUFFER目标在glBindBuffer中的含义是什么?

我对VBO很困惑,

glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
Run Code Online (Sandbox Code Playgroud)

除了GL_ARRAY_BUFFER,还有其他目标类型:GL_ATOMIC_COUNTER_BUFFER,GL_COPY_READ_BUFFER ......

但是,Opengl手册没有提到这些目标的含义.我检查了glew.h:

#define GL_ARRAY_BUFFER 0x8892
Run Code Online (Sandbox Code Playgroud)

这是否意味着目标(如GL_ARRAY_BUFFER)是地址?

目标 - GL_ARRAY_BUFFER在glBindBuffer中的含义是什么?

opengl graphics shader opengl-es glsl

21
推荐指数
1
解决办法
2万
查看次数

使用片段着色器在2d多边形上绘制边框

我有一些简单的多边形(少于20个顶点)在一个简单的xy平面上渲染平面,使用GL_TRIANGLES和一个平面颜色,一个2d模拟.

我想为这些多边形添加可变厚度和不同颜色的边框.我有一些使用相同顶点和glLineWidth/GL_LINE_LOOP实现的东西,它起作用,但是是另一个渲染过程并重复所有顶点变换.

我想我应该能够使用gl_FragCoord和顶点数据和/或纹理坐标在片段着色器中完成此操作,但我不确定,我的天真尝试显然是不正确的.

我想象下面的东西.

uniform vec2 scale;  // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;

varying vec4 vertex; // in world coords

void main()
{
    if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
    {
        // we're close to the edge the polygon, so we're the border.
        gl_FragColor = border_color;
    }
    else
    {
        gl_FragColor = fill_color;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的部分是distance_from_edge函数 - 如何计算?使用gl_FragCoord是错误的方法 - 我应该使用某种纹理映射吗?

作为一个实验,我尝试用缩放将顶点转换为像素空间,然后以像素为单位计算它与gl_FragCoord之间的距离,但这会产生我并不真正理解的奇怪结果.另外我需要到边缘的距离,而不是顶点,但我不知道如何得到它.

有任何想法吗?

编辑:根据尼科尔的回应,我的问题变成:

假设我有一个三角形,其中3个角顶点标记为边缘顶点,并且中间的一个顶点标记为非边缘(因此总共渲染了3个三角形),那么如何在片段着色器中插值以绘制给定边框厚度?我假设我将边缘标志传递给片段着色器,以及所需的线条粗细,并进行一些插值计算以计算边缘与非边缘顶点之间的距离,并将颜色阈值设置为适当的边界/填充?

opengl-es glsl vertex-shader fragment-shader opengl-es-2.0

21
推荐指数
1
解决办法
2万
查看次数

顶点着色器如何将颜色信息传递给片段着色器?

在一个简单的hello-world OpenGL程序中,它简单地在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色,绿色和蓝色时,三角形用渐变填充.

但是当我使用这样的着色器时:

顶点着色器:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

void main(void) {
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
    vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)

其中的属性aVertexaColor来自一个顶点缓冲,通过调用传递glVertexAttribPointer.

片段着色器:

varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)

三角形仍然充满了渐变,这里有一个问题:

如果每个顶点计算顶点着色器,vColor则应为每个实例分配顶点的颜色.并且顶点颜色应该是红色,绿色或蓝色,如顶点缓冲区中设置的那样.

那么渐变来自哪里?

或者,换句话说,什么时候发生在碎片着色器中,vColor结果是插值颜色而不是顶点?

opengl shader glsl

21
推荐指数
1
解决办法
2万
查看次数

如何将多个纹理传递到单个着色器?

我使用freeglut,GLEW 和魔鬼,以呈现纹理的茶壶使用顶点和片段着色器.这在Ubuntu 14.04上的OpenGL 2.0和GLSL 1.2中都运行良好.

现在,我想将凹凸贴图应用于茶壶.我的讲师显然不会酿造他自己的茶,所以不知道他们应该是顺利的.无论如何,我找到了一个关于老式凹凸贴图的漂亮教程,其中包括一个片段着色器,它开始于:

uniform sampler2D DecalTex; //The texture
uniform sampler2D BumpTex; //The bump-map 
Run Code Online (Sandbox Code Playgroud)

他们没有提到的是如何将两个纹理首先传递给着色器.

以前我

//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);

//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

//Fragment shader
gl_FragColor = color * texture2D(DecalTex,gl_TexCoord[0].xy);
Run Code Online (Sandbox Code Playgroud)

所以现在我

//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
glBindTexture(GL_TEXTURE_2D, bumpHandle);

//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;

//Fragment shader
gl_FragColor = color * texture2D(BumpTex,gl_TexCoord[0].xy);
//no bump logic yet, just testing I …
Run Code Online (Sandbox Code Playgroud)

opengl glsl texture-mapping texture2d opengl-2.0

21
推荐指数
1
解决办法
2万
查看次数

你能在同一个程序中有多个像素(片段)着色器吗?

我想有两个像素着色器; 第一个做一件事,然后下一个做别的事情.这是可能的,还是我必须将所有内容打包到一个着色器中?

opengl shader pixel glsl fragment-shader

20
推荐指数
1
解决办法
9214
查看次数

简单的GLSL卷积着色器非常慢

我正在尝试在iOS的OpenGL ES2.0中实现2D轮廓着色器.这太疯狂了.如在5fps慢.我已将其跟踪到texture2D()调用.但是,如果没有这些,任何卷积着色器都是可撤消的.我尝试过使用lowp而不是mediump,但是一切都只是黑色,虽然它确实给了另外5fps,但它仍然无法使用.

这是我的片段着色器.

    varying mediump vec4 colorVarying;
    varying mediump vec2 texCoord;

    uniform bool enableTexture;
    uniform sampler2D texture;

    uniform mediump float k;

    void main() {

        const mediump float step_w = 3.0/128.0;
        const mediump float step_h = 3.0/128.0;
        const mediump vec4 b = vec4(0.0, 0.0, 0.0, 1.0);
        const mediump vec4 one = vec4(1.0, 1.0, 1.0, 1.0);

        mediump vec2 offset[9];
        mediump float kernel[9];
        offset[0] = vec2(-step_w, step_h);
        offset[1] = vec2(-step_w, 0.0);
        offset[2] = vec2(-step_w, -step_h);
        offset[3] = vec2(0.0, step_h);
        offset[4] = vec2(0.0, 0.0); …
Run Code Online (Sandbox Code Playgroud)

opengl-es glsl filter convolution opengl-es-2.0

20
推荐指数
2
解决办法
1万
查看次数