标签: fragment-shader

使用顶点着色器计算球体的边界四边形

我正在尝试从图形纸中实现算法,并且算法的一部分将已知半径的球体渲染到缓冲区.他们说他们通过计算顶点着色器中的位置和大小来渲染球体,然后在片段着色器中进行适当的着色.

有没有猜到他们实际上是怎么做到的?位置和半径在世界坐标中是已知的,投影是透视的.这是否意味着球体将被投影为圆圈?

opengl geometry vertex-shader fragment-shader

8
推荐指数
1
解决办法
2132
查看次数

如何为附加纹理的帧缓冲区编写传递顶点和片段着色器?

我正在尝试使用着色器来修改绑定到帧缓冲区的纹理,但我对着色器如何获得"原始"输入值感到困惑.

我正在做以下事情:

GLuint textureId = 0;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, ...);

GLuint framebufferId = 0;
glGenFramebuffers(1, &framebufferId);
glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
glBindTexture(GL_TEXTURE_2D, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) { ... }

glUseProgram(programId);
const GLenum buffer = GL_COLOR_ATTACHMENT0;
glDrawBuffers(1, &buffer);
Run Code Online (Sandbox Code Playgroud)

空顶点和片段着色器看起来像什么?由于我没有绘制灵长类动物,如何设置gl_Position顶点着色器?如何通过输入颜色作为片段着色器的输出颜色?

空顶点着色器:

#version 330

void main()
{
    gl_Position = ??;
}
Run Code Online (Sandbox Code Playgroud)

空片段着色器:

#version 330

layout(location = 0) out vec4 out_colour;

void main()
{
    out_colour = ???;
}
Run Code Online (Sandbox Code Playgroud)

opengl vertex-shader fragment-shader

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

GLSL着色器在需要时不展开循环

我的9600GT讨厌我.

片段着色器:

#version 130

uint aa[33] = uint[33](
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0
);

void main() {
    int i=0;
    int a=26;

    for (i=0; i<a; i++) aa[i]=aa[i+1];

    gl_FragColor=vec4(1.0,0.0,0.0,1.0);

}
Run Code Online (Sandbox Code Playgroud)

如果a=25程序以3000 fps运行.
如果a=26程序以20 fps运行.
如果aa未出现<= 32问题的大小.
视口大小为1000x1000.
仅当大小aa> 32 时才会出现问题.
的值a作为阈值与调用循环内的阵列变化(aa[i]=aa[i+1]+aa[i-1]给出了不同的期限).
我知道gl_FragColor已被弃用.但那不是问题.

我的猜测是,如果> 25且大小(aa)> 32,GLSL不会自动展开循环.为什么.它取决于阵列大小的原因是人类所不知道的.

这里解释了一个非常相似的行为:http:
//www.gamedev.net/topic/519511-glsl-for-loops/

手动展开循环确实解决了问题(3000 fps),即使aa大小> 32:

    aa[0]=aa[1];
    aa[1]=aa[2];
    aa[2]=aa[3];
    aa[3]=aa[4];
    aa[4]=aa[5];
    aa[5]=aa[6];
    aa[6]=aa[7];
    aa[7]=aa[8];
    aa[8]=aa[9];
    aa[9]=aa[10];
    aa[10]=aa[11];
    aa[11]=aa[12];
    aa[12]=aa[13];
    aa[13]=aa[14];
    aa[14]=aa[15]; …
Run Code Online (Sandbox Code Playgroud)

opengl glsl fragment-shader loop-unrolling

8
推荐指数
1
解决办法
5601
查看次数

LookAt功能:我疯了

我必须做一个功课,我尝试实现lookAt功能.我试过很多方面,但我得到的唯一结果是蓝屏.我的程序的其余部分工作很大,事实上,如果我使用glm :: lookAt一切都很好.这是我的代码:

mat4 Transform::lookAt(const vec3 &eye, const vec3 &center, const vec3 &up) 
{
    vec3 w(glm::normalize(eye - center)) ;
        vec3 u(glm::normalize(glm::cross(up, w)));
        vec3 v(glm::cross(w, u)) ;
    mat4 ret = mat4 (
        vec4 (u.x,v.x,w.x,0),
            vec4 (u.y,v.y,w.y,0),
            vec4 (u.z,v.z,w.z,0),
        vec4 (-u.x*eye.x-u.y*eye.y-u.z*eye.z,
             -v.x*eye.x-v.y*eye.y-v.z*eye.z,
             -w.x*eye.x-w.y*eye.y-w.z*eye.z,
             1)
    );
  return ret;
Run Code Online (Sandbox Code Playgroud)

opengl vector matrix fragment-shader glulookat

8
推荐指数
1
解决办法
9771
查看次数

什么是OpenGL ES 2.0中gl_TexCoord的对应物

我有一个OpenGL着色器,它使用gl_TexCoord,如下所示.但在OpenGL ES中,不支持gl_TexCoord.我想知道如何重构代码以使其在OpenGL ES上运行.

void main() 
{
    //scene depth calculation
    float depth = linearize(texture2D(inputImageTexture2,gl_TexCoord[0].xy).x);
    if (depthblur)
    {
        depth = linearize(bdepth(gl_TexCoord[0].xy));
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

opengl-es fragment-shader ios

7
推荐指数
1
解决办法
5068
查看次数

MSAA的抗锯齿问题,深度绘制CSG和FBO

我已经为现代OpenGL版本重新实现了OpenCSG.

PixelFormatAttributes:

NSOpenGLPFAColorSize    , 24 ,
NSOpenGLPFAAlphaSize    , 8  ,
NSOpenGLPFADepthSize    , 32 ,
NSOpenGLPFAStencilSize  , 8  ,
NSOpenGLPFAAccelerated  ,
NSOpenGLPFADoubleBuffer ,
NSOpenGLPFASupersample  ,
NSOpenGLPFASampleBuffers, 1  ,
NSOpenGLPFASamples      , 4  ,
Run Code Online (Sandbox Code Playgroud)

FBO规格:( 尝试使用多重采样渲染到FBO,但线条越来越强大且可见,请查看底部的屏幕截图)
- 创建功率为2的纹理,GL_RGBA(尝试过GL_RGBA8和GL_RGBA32F)
- GL_DEPTH24_STENCIL8(尝试过GL_DEPTH32_STENCIL8,没有结果)


简单算法Goldfeather:

while (i < depth complexity) {
    take channel for render
       merge layers if no free channel 
    render each layer with stencil func, mask and depth params to channel (FBO)
}
merge layers (taking texture from FBO and render objects again …
Run Code Online (Sandbox Code Playgroud)

opengl fbo csg fragment-shader opengl-3

7
推荐指数
1
解决办法
864
查看次数

前两个片段着色器输出是不同的

我目前正试图让这个散景着色器与GPUImage一起使用:http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update )

这就是我现在所拥有的:

precision mediump float;

varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
uniform float inputImageTextureWidth;
uniform float inputImageTextureHeight;

#define PI 3.14159265

float width = inputImageTextureWidth; //texture width
float height = inputImageTextureHeight; //texture height

vec2 texel = vec2(1.0/width,1.0/height);

//uniform variables from external script

uniform float focalDepth;  //focal distance value in meters, but you may use autofocus option below
uniform float focalLength; //focal length in mm
uniform float fstop; //f-stop value
bool …
Run Code Online (Sandbox Code Playgroud)

glsl fragment-shader ios gpuimage glsles

7
推荐指数
1
解决办法
937
查看次数

iResolution在着色器中的含义是什么?

我是glsl的新手.我发现每个演示https://www.shadertoy.com/new都有一个变量iResolution ,这是什么意思?如果我想将此变量传递给着色器,我还需要做什么?

glsl fragment-shader

7
推荐指数
1
解决办法
5155
查看次数

Three.js,自定义着色器和具有透明度的png纹理

我有一个非常简单的PNG纹理:一个带有透明背景的灰色圆圈.

PNG图像具有透明度

我使用它作为一个统一mapTHREE.ShaderMaterial:

var uniforms = THREE.UniformsUtils.merge( [basicShader.uniforms] );
uniforms['map'].value = THREE.ImageUtils.loadTexture( "img/particle.png" );
uniforms['size'].value = 100;
uniforms['opacity'].value = 0.5;
uniforms['psColor'].value = new THREE.Color( 0xffffff );
Run Code Online (Sandbox Code Playgroud)

这是我的片段着色器(只是其中的一部分):

gl_FragColor = vec4( psColor, vOpacity );
gl_FragColor = gl_FragColor * texture2D( map,vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );
gl_FragColor = gl_FragColor * vec4( vColor, 1.0 );
Run Code Online (Sandbox Code Playgroud)

我将材料应用于某些粒子(THREE.PointCloud网格)并且效果很好:

颗粒纹理透明:好的!

但如果我将相机旋转超过180度,我会看到:

颗粒纹理没有透明度

我知道片段着色器没有正确考虑PNG纹理的alpha值.

在这种情况下,最好的方法是什么,以获得正确的颜色和不透明度(来自自定义属性)并仍然从PNG获得alpha权限?

为什么一方面表现正常?

shader png textures fragment-shader three.js

7
推荐指数
1
解决办法
2135
查看次数

Android OpenGL 以原始(小)分辨率渲染到帧缓冲区,然后将其(viewPort)缩放到屏幕尺寸

我有一个 NV21 (YUV420) 相机视频,我在其上应用了片段着色器,以获得一些滤镜效果以及 YUV 到 RGB 的转换。除了性能不佳之外,一切都正常。我的片段着色器有点重,因为它有很多textur2D()调用。

原始帧分辨率是 480x640 像素,我注意到,如果我将视口设置为这个原始大小(而不是全屏大小),它就会工作得很好且流畅。

所以基本上我需要首先渲染帧并在帧缓冲区(FBO)中以原始大小处理它,然后(在着色器工作完成后)使用视口(主要是 1080x1920)将其缩放到全屏大小,这意味着“繁重的”处理工作将应用于少得多的碎片。

我在这里找到了一些教程和类似的问题如何实现这一点,但不幸的是我对此没有运气。(出现一些黑屏或 GL_INVALID_OPERATION 等)...任何帮助将不胜感激。

另外,我不知道如何处理(如果可能的话)的另一个(可选)性能调整是以某种方式将这 3 个纹理(Y_tex、U_tex 和 V_tex)组合为单个纹理,该纹理将统一到着色器作为单个纹理采样器,然后我只需texture2D()在着色器中进行一次调用即可获取当前的 YUV 值并将其转换为 RGB 值。

这是我的渲染器代码:

static class MyRenderer implements GLSurfaceView.Renderer
{
    int mTextureIds[] = new int[3];
    float[] mScaleMatrix = new float[16];

    private FloatBuffer mVertexBuffer;
    private FloatBuffer mTextureBuffer;
    private ShortBuffer mDrawListBuffer;

    boolean mVideoFitEnabled = true;
    boolean mVideoDisabled = false;

    // number of coordinates per vertex in this array
    static final int COORDS_PER_VERTEX = 3;
    static final …
Run Code Online (Sandbox Code Playgroud)

android opengl-es glsl fragment-shader

7
推荐指数
1
解决办法
4005
查看次数