标签: shader

通过 glUniform OpenGL ES 2.0 在着色器中移动对象

如何通过 glUniform** 移动世界中的对象?

我试过 glUniform3f(_positionSlot, 6.0f, 6.0f, -2.0f);

但我的物体没有动。

着色器.vs:

attribute vec4 Position; // 1
attribute vec4 SourceColor; // 2
varying vec4 DestinationColor; // 3
uniform mat4 Projection;
uniform mat4 Modelview;

void main(void) { // 4
   DestinationColor = SourceColor; // 5
   gl_Position = Projection * Modelview *Position;

}
Run Code Online (Sandbox Code Playgroud)

雷德:

- (void)render:(CADisplayLink*)displayLink {
    glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    CC3GLMatrix *projection = [CC3GLMatrix matrix];
    float h = 4.0f * self.frame.size.height / self.frame.size.width;
    [projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 …
Run Code Online (Sandbox Code Playgroud)

shader opengl-es vertex-shader opengl-es-2.0

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

WebGL:INVALID_VALUE:attachShader:没有对象或对象被删除。这暗中有用吗?

我开始接触 WebGL,我想知道是否有一个学习错误输出的好地方。

我不断收到以下错误

WebGL: INVALID_VALUE: attachShader: no object or object deleted localhost:1   
WebGL: INVALID_OPERATION: getAttribLocation: program not linked localhost:1
WebGL: INVALID_OPERATION: getUniformLocation: program not linked localhost:1
WebGL: INVALID_OPERATION: useProgram: program not valid localhost:1
WebGL: INVALID_OPERATION: drawElements: attribs not setup correctly 
Run Code Online (Sandbox Code Playgroud)

所以,我从这些错误中可以看出我的着色器无法工作

gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
Run Code Online (Sandbox Code Playgroud)

随后的错误与没有程序有关。

所以我的问题是:我如何找出代码中出了什么问题?

该程序没有以某种方式定义,而我确实有var program = gl.createProgram();。那么,为什么会发生这种情况呢?我该往哪里看?我猜测这是因为我的着色器无法编译,但据我所知,我的着色器中出现了 0 个错误或警告。它被前面提到的代码/警告混淆了......此外,chrome 提到了这些警告,而 firefox 没有。但两者都无法初始化着色器

javascript shader opengl-es webgl vertex-shader

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

如何使用 glReadPixels 读取浮点数据

几天来我一直在尝试使用glReadPixels.

我的cpp代码:

//expanded to whole screen quad via vertex shader
glDrawArrays( GL_TRIANGLES, 0, 3 );

int size = width * height;
GLfloat* pixels = new GLfloat[ size ];
glReadPixels( 0, 0, width, height, GL_RED,  GL_FLOAT, pixels );

pixelVector.resize( size );
for ( int i = 0; i < size; i++ ) {
    pixelVector[i] =  (float) pixels[i];
}
Run Code Online (Sandbox Code Playgroud)

和我的着色器代码:

out float data;

void main()
{  
  data = 0.02;
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是我得到 0.0196078 作为输出。但当数据为 0.2 时一切都很好。如果数据为 0.002,则全为 0。什么可能导致这种情况?

c++ opengl graphics shader glsl

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

glShaderSource() 上的分段错误

char buffer[1024];   

memset(buffer, 0, sizeof(buffer));
FILE *vertexShaderFile = fopen(vertexShaderPath.c_str(), "rb");
fread(buffer, 1, sizeof(buffer) - 1, vertexShaderFile);
fclose(vertexShaderFile);

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const char **)&buffer, nullptr);
glCompileShader(vertexShader);
Run Code Online (Sandbox Code Playgroud)

使用此代码,我在调用 时遇到分段错误glShaderSource()。使用 GDB,我已经确认(着色器代码)的内容buffer正确地以 null 终止。最重要的是,我检查了 和GLEW_ARB_shader_objects都已glShaderSource加载。

这里可能发生了什么?


buffer经过一番修补后,我发现如果我在堆上制作一个副本,即通过std::string从中制作 a 并将glShaderSource()指针传递给其返回的指针c_str(),它就可以工作。

现在我更困惑了。


最重要的是,即使我只是声明一个char *指向buffer并将其传递进去,它也能工作。当您声明指向数组的指针与声明指向指针的指针时,C++11 是否做了一些特殊的事情?

c++ opengl shader segmentation-fault

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

如何在 Three.js 中向 ShaderMaterial 添加颜色?

我对 Three.js 还很陌生,所以请耐心等待。因此,我被分配了一个项目,其中涉及使用 WebGL 创建车身并在鼠标按下时将其压凹。我正在尝试将凹痕的颜色从车身颜色更改为黄色。知道该怎么做吗?注意:我只想改变凹痕的颜色,而不是整个车的颜色。

这是凹痕材质的代码。我的第一个想法是为着色器材质添加颜色,但这不起作用,所以我将其注释掉。

var dentMaterial = new THREE.ShaderMaterial({
    uniforms : {
        size : { type: 'f', value : 20.0 },
        near : { type: 'f', value : camera.near },
        far  : { type: 'f', value : camera.far }
        //color:  { type: 'v3', value: { x: 1, y: 1, z: 1 } }
       // map  : { type: "t", value : THREE.ImageUtils.loadTexture( 'textures/heatmap.jpg' ) } //here
      },
      attributes : {},
      vertexColors: THREE.VertexColors,
      vertexShader: vertShader,
      fragmentShader: fragShader,
      side: THREE.DoubleSide, …
Run Code Online (Sandbox Code Playgroud)

javascript shader three.js

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

如何统一从计算着色器修改纹理像素?

我在 vuforia 中偶然发现了一个奇怪的问题。当我使用 CameraDevice.GetCameraImage(mypixelformat) 请求相机图像时,返回的图像既向侧面翻转又旋转了 180 度。因此,要获得正常图像,我必须先旋转图像,然后将其侧向翻转。我使用的方法只是迭代图像的像素并修改它们。这种方法的性能非常差。下面是代码:

    Texture2D image;

    CameraDevice cameraDevice = Vuforia.CameraDevice.Instance;
    Vuforia.Image vufImage = cameraDevice.GetCameraImage(pixelFormat);
    image = new Texture2D(vufImage.Width, vufImage.Height);
    vufImage.CopyToTexture(image);

    Color32[] colors = image.GetPixels32();
    System.Array.Reverse(colors, 0, colors.Length);  //rotate 180deg
    image.SetPixels32(colors);                       //apply rotation
    image = FlipTexture(image);                      //flip sideways






                 //***** THE FLIP TEXTURE METHOD *******//

private Texture2D FlipTexture(Texture2D original, bool upSideDown = false)
{

    Texture2D flipped = new Texture2D(original.width, original.height);

    int width  = original.width;
    int height = original.height;


    for (int col = 0; col < width; col++)
    {
        for …
Run Code Online (Sandbox Code Playgroud)

shader image-processing texture2d unity-game-engine compute-shader

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

为什么在使用 OpenGL 编译顶点着色器时会出现着色器编译器错误 #143、#160 和 #216?

我刚刚开始学习 C++ 中的 Grpahics,以及着色器和精灵。我写了一个小的顶点着色器和一个片段着色器。

顶点着色器:

#version 130

in vec2 vertexPosition;

void main() {
    gl_Position.xy = vertexPosition;
    gl_Position.z = 0.0;
    gl_Position.w = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 130

out vec3 color;

void main() {
    color = vec3(0.94, 0.37, 0.36);
}
Run Code Online (Sandbox Code Playgroud)

编译时,我收到以下错误消息:

Fragment shader failed to compile with the following errors:
ERROR: 0:6: error(#143) Undeclared identifier: gl_Position
ERROR: 0:6: error(#216) Vector field selection out of range "xy"
ERROR: 0:6: error(#160) Cannot convert from: "default in highp 2-component vector of vec2" to: "float"
ERROR: …
Run Code Online (Sandbox Code Playgroud)

c++ opengl graphics shader glsl

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

如何在 Scenekit 中确定几何表面的方向

我正在尝试编写一个着色器来为 SceneKit 中的自定义几何图形着色。我想设置颜色,以便朝上的水平表面是白色,朝下的水平表面是黑色,而中间的所有其他表面都是基于其方向的灰色阴影。我使用材质的表面入口点来调用以下着色器

vec4 normal = vec4(_surface.normal, 1.0);

// Assume value is [-1, 1], scale to [0, 1]
float color = normal.z * 0.5 + 0.5;

_surface.diffuse = vec4(color, color, color, 1.0);
Run Code Online (Sandbox Code Playgroud)

似乎normal.z是相对于相机(或视图)。我假设我需要转换该值,以便它位于另一个空间中。我尝试了多种变换(和变换的组合),例如u_inverseViewTransform,但结果似乎都在视图空间中。有谁知道如何根据其表面的方向为几何体着色?

shader glsl coordinate-transformation ios scenekit

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

如何创建多色噪声着色器

我需要一个采用 3 种输入颜色并产生噪声的着色器,如下所示。借助“噪声纹理”和“颜色渐变”节点,在 Blender 中很容易实现。

我找到了这个 gist,这可能会解决我的问题。但我无法配置颜色。而且噪音看起来比 Blender 中的结果“更锐利”。

我需要为此编写自己的着色器还是有更简单的方法来使用 ThreeJS 实现这种效果?

shader glsl blender three.js

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

为什么我不能在 GLSL 中使用多个“in”变量?

考虑我的着色器程序。

const char* vert_shader_script =

"#version 330 core\n                                    \n\
                                                        \n\
layout(location = 0) in vec3 vertex_pos;                \n\
layout(location = 1) in vec2 texture_uv;                \n\
                                                        \n\
uniform mat4 M, V, P;                                   \n\
                                                        \n\
out vec2 uv;                                            \n\
                                                        \n\
void main() {                                           \n\
                                                        \n\
    gl_Position = P * V * M * vec4(vertex_pos, 1.0);    \n\
    uv = texture_uv;                                    \n\
}\n";
Run Code Online (Sandbox Code Playgroud)
const char* frag_shader_script =

"#version 330 core                                                                  \n\
                                                                                    \n\
uniform sampler2D texture0;                                                         \n\
uniform vec4 override_color;                                                        \n\
uniform vec2 player_pos;                                                            \n\
                                                                                    \n\ …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader glsl

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