标签: fragment-shader

OpenGL 着色器 GLSL 中的颜色按位移位

我将 vec4 传递给带有 xyz 和颜色值的着色器,并且尝试将颜色分量按位移动到它们自己的 rg 和 b 浮点,但遇到问题:

顶点着色器:

#version 150

in vec4 position;

out vec2 Texcoord;

uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;

void main()
{
    Texcoord = vec2(position.w, position.w);
    gl_Position = proj * view * model * vec4(position.xyz, 1.0);
} 
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 150

in vec2 Texcoord;
out vec4 outColor;

uniform sampler2D tex;

void main()
{
    float data = Texcoord.r;
    float r = (data>> 16) & 0xff;
    float g = (data>> 8) & 0xff;
    float b …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl fragment-shader

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

无法在三星设备上分配变量 [OpenGL ES]

在三星设备上编译模糊着色器失败并出现错误:无法分配变量

着色器代码如下:

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoord;
varying vec2 v_blurTexCoords[14];
varying vec2 pixel_size;

uniform vec2 v_resolution;
uniform sampler2D u_texture;
uniform mat4 u_projTrans;

void main()
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

在其他设备上运行良好,三星设备可能有什么问题?

android opengl-es fragment-shader

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

在片段着色器中绘制线段

我正在努力理解以下代码,其想法是在片段着色器中绘制一个简单的段。我尝试分解它,但我仍然不明白???线。如果有一个很好的解释那就太好了。我在 SO 或 Google 上找不到任何东西。

float lineSegment(vec2 p, vec2 a, vec2 b) {
    float thickness = 1.0/100.0;

    vec2 pa = p - a;
    vec2 ba = b - a;

    float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
    // ????????
    float idk = length(pa - ba*h);

    return smoothstep(0.0, thickness, idk);
}
Run Code Online (Sandbox Code Playgroud)

原始代码来自TheBookOfShaders。

shader glsl fragment-shader

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

如何防止在 THREE.js 着色器中插入顶点颜色?

我正在尝试编写一个在网格上绘制轮廓图的着色器。

这是等高线图的示例。

我的第一个目标是用不同的颜色可视化一个三角形的脸。您可以在此处找到我正在使用的代码。

<html lang="en">
    <head>
        <title>Face Contour Example</title>

    </head>
    <body>

<script src="http://threejs.org/build/three.min.js"></script>
<script src="http://threejs.org/examples/js/controls/OrbitControls.js"></script>



        <script id="vertexShader" type="x-shader/x-vertex">


        varying vec3 vColor;

        void main(){
            vColor = color;
            gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }
        </script>

        <script id="fragmentShader" type="x-shader/x-fragment">
            varying vec3 vColor;

            void main(){
                gl_FragColor = vec4( vColor.rgb, 1.0 );
            }
        </script>


        <script type="text/javascript">
            var camera, scene, renderer, mesh, material, controls;
            init();
            animate();

            function init() {
                // Renderer.
                renderer = new THREE.WebGLRenderer();
                //renderer.setPixelRatio(window.devicePixelRatio);
                renderer.setSize(window.innerWidth, window.innerHeight);
                // …
Run Code Online (Sandbox Code Playgroud)

glsl webgl vertex-shader fragment-shader three.js

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

着色器 - 通过“拉动”像素来防鱼眼

我想修复该图像的失真:

在此输入图像描述

对于质量感到抱歉,但这是我能找到的最好的例子。

我不知道是否可以修复这种失真(我想要有直门和直天花板),但基本上,我不是将像素推到图像之外(红色箭头)来添加模糊效果,而是想做相反的事情(绿色箭头),将像素拉向中心。

如果你有任何想法,那就太棒了。也欢迎其他解决方案!

shader glsl fragment-shader

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

为什么 glUseProgram 每帧都用 glUniform 调用?

我正在关注 OpenGL v3.3 教程,该教程指导我使用glUniform4f修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL是一个状态机,我们不解除绑定当前shaderProgram被使用,我们宁可修改赋予给该程序的着色器的一个属性,那么为什么我们需要调用glUseProgram每一帧?

我知道对于更高版本的 OpenGL,情况并非如此,但我仍然想了解为什么 v3.3 会出现这种情况

OpenGL程序:

while (!glfwWindowShouldClose(window))
{
    processInput(window);

    glClearColor(0.2f, 1.0f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);


    glUseProgram(shaderProgram); // the function in question

    float redValue = (sin(glfwGetTime()) / 2.0f) + 0.5f;
    int colorUniformLocation = glGetUniformLocation(shaderProgram, "ourColor");
    glUniform4f(colorUniformLocation, redValue, 0.0f, 0.0f, 1.0f);

    std::cout << colorUniformLocation << std::endl;

    glBindVertexArray(VAO[0]);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(VAO[1]);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glfwSwapBuffers(window);
    glfwPollEvents();
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

#version 330 core
out vec4 FragColor;
uniform vec4 ourColor;
void main() 
{
 FragColor = ourColor;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我忘了指出 …

c++ opengl fragment-shader

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

在 Opengl es 2.0 片段着色器中有没有办法获得以前的片段颜色

我的代码正在绘制背景图像并在该图像之上绘制一些其他图像(粒子)。我想让粒子有一些混合效果,比如变暗、变亮、燃烧……和Canvas globalcompositeoperation一样。所以在片段着色器中,我需要获取之前的片段颜色并将其与新颜色混合。但我找不到办法做到这一点。

android opengl-es glsl fragment-shader opengl-es-2.0

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

在VS2022中构建像素着色器项目

我有一个旧的类库项目,在以前版本的 Visual Studio (2017 IIRC) 中构建得很好。该项目包含一个基于 HLSL 的像素着色器,可生成径向颜色选择器。我刚刚将它移植到 VS2022,它不再构建,告诉我它找不到构建任务。这是错误消息:

无法从程序集 ShaderBuildTask 加载“ShaderBuildTask.PixelShaderCompile”任务,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125。无法加载文件或程序集“ShaderBuildTask,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125”或其依赖项之一。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项均可用,并且任务包含实现 Microsoft.Build.Framework.ITask.AngularGradientShaderEffect 的公共类

我已经ShaderBuildTaskSetup.msi在我的机器上安装了所需的着色器编译器 ( )。重新加载项目并重新启动 VS 也没有帮助。

有人在 VS2022 中使用像素着色器来看看我缺少什么吗?

hlsl msbuild-task visual-studio fragment-shader

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

将BOOL值发送到iOS/iPhone上的Fragment Shader OpenGL ES 2.0

我是OpenGL ES 2.0的新手,所以请耐心等待...我想将BOOL标志传递到我的片段着色器中,以便在我的应用程序中发生某个触摸事件后,它会以不同的方式呈现gl_FragColor.我尝试使用vec2属性并将"伪造".x值作为我的"BOOL",但看起来OpenGL在着色器获得它之前将值从0.0归一化到1.0.所以即使在我的应用程序中我将它设置为0.0,而着色器正在做它的事情,该值最终将达到1.0.任何建议都将非常感激.

VertexAttrib代码:

// set up context, shaders, use program etc.

[filterProgram addAttribute:@"inputBrushMode"];
inputBrushModeAttribute = [filterProgram attributeIndex:@"inputBrushMode"];

bMode[0] = 0.0;
bMode[1] = 0.0;

glVertexAttribPointer(inputBrushModeAttribute, 2, GL_FLOAT, 0, 0, bMode);
Run Code Online (Sandbox Code Playgroud)

当前顶点着色器代码:

...
attribute vec2 inputBrushMode;
varying highp float brushMode;

void main()
{
    gl_Position = position;
    ...
    brushMode = inputBrushMode.x;
}
Run Code Online (Sandbox Code Playgroud)

当前片段着色器代码:

...
varying highp float brushMode;

void main()
{
    if(brushMode < 0.5) {
        // render the texture
        gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
    } else {
        // cover things in yellow funk …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es fragment-shader ios opengl-es-2.0

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

着色器中的Threejs正常值设置为0

我正在尝试使用本教程,但我遇到了两个问题,其中一个问题可以在这里找到.另一个是以下.

为方便起见,这是应该工作的代码,这里是一个jsfiddle.

顶点着色器:

uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
attribute vec3 position;
uniform vec3 normal;
varying vec3 vNormal;

void main() {
    test = 0.5;
    vNormal = normal;
    gl_Position = projectionMatrix *
                modelViewMatrix *
                vec4(position,1.0);
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:不同的mediump vec3 vNormal;

void main() {
    mediump vec3 light = vec3(0.5, 0.2, 1.0);

    // ensure it's normalized
    light = normalize(light);

    // calculate the dot product of
    // the light to the vertex normal
    mediump float dProd = max(0.0, dot(vNormal, …
Run Code Online (Sandbox Code Playgroud)

shader webgl vertex-shader fragment-shader three.js

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