标签: vertex-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
查看次数

OpenGL漫反射照明着色器Bug?

橙皮书第16.2节列出了实施漫射照明:

void main()
{
  vec3 N = normalize(gl_NormalMatrix * gl_Normal);
  vec4 V = gl_ModelViewMatrix * gl_vertex;
  vec3 L = normalize(lightPos - V.xyz);
  gl_FrontColor = gl_Color * vec4(max(0.0, dot(N, L));
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我移动相机时灯光会发生变化.另一方面,当我改变

  vec3 N = normalize(gl_NormalMatrix * gl_Normal);
Run Code Online (Sandbox Code Playgroud)

to vec3 N = normalize(gl_Normal);

我获得了像固定管道一样工作的漫射光.

什么是gl_NormalMatrix,删除它做了什么,...这是橙皮书中的一个错误......还是我不正确地设置我的OpenGl代码?

[为完整起见,片段着色器只复制颜色]

vertex-shader fragment-shader

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

轮廓轮廓着色器

我正在尝试实现GLSL着色器,该着色器将突出显示渲染的3D网格的外部边缘。问题是我无权访问OpenGL客户端代码,因此只能在GLSL着色器中完成。

我的第一个尝试是从Unity使用/采用着色器,并在OpenGL GLSL中进行操作。这里看起来应该是这样:

在此处输入图片说明

这是我得到的:

在此处输入图片说明

我不确定我是否可以正确计算内容,但是如您所见,输出与我的期望值相差甚远。

这是食人魔的材料

material Chassis 
    {
    technique
        {    
        pass standard
            {
            cull_software back         
            scene_blend zero one
            }
        pass psssm
            {         
            cull_software front 
            scene_blend src_alpha one_minus_src_alpha         
            vertex_program_ref reflection_cube_specularmap_normalmap_vs100 
                {
                param_named_auto modelViewProjectionMatrix worldviewproj_matrix
                param_named_auto normalMatrix inverse_transpose_world_matrix
                param_named_auto modelView worldview_matrix
                param_named_auto camera_world_position camera_position
                param_named_auto inverse_projection_matrix inverse_projection_matrix
                param_named_auto  projection_matrix projection_matrix
                param_named_auto  p_InverseModelView inverse_worldview_matrix
                }
            fragment_program_ref reflection_cube_specularmap_normalmap_fs100
                {                
                }    
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是顶点着色器

material Chassis 
    {
    technique
        { …
Run Code Online (Sandbox Code Playgroud)

opengl shader glsl vertex-shader

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

GLSL错误:"类型应为float或int"

我正在尝试编译一个着色器,它正在一台PC上的Intel HD上进行编译,而不是在另一台PC上的AMD驱动程序上进行编译.

顶点着色器:

#version 330
precision mediump float;
precision lowp sampler2D;

uniform mat4 ProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 WorldViewMatrix;
in vec3 position;
in vec2 TexCoord;
out vec2 texCoord;

void main() {
    texCoord = TexCoord;
    gl_Position = ProjectionMatrix * ModelViewMatrix * WorldViewMatrix * vec4(position, 1);
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 330
precision mediump float;
precision lowp sampler2D;

uniform vec4 TextureHueColor;
uniform sampler2D TextureUnit;
in vec2 texCoord;
out vec4 gl_FragColor;

void main() {
    gl_FragColor = texture(TextureUnit, texCoord) * TextureHueColor;
}
Run Code Online (Sandbox Code Playgroud)

在AMD驱动程序上,我得到:

Vertex shader …
Run Code Online (Sandbox Code Playgroud)

opengl shader glsl vertex-shader

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

不支持512字节长度的顶点着色器

我正在开发一个基于着色器的简单游戏,当我的顶点着色器文件长大,它的大小达到512字节,我现在无法用c ++加载它.我不认为这是一个常见的问题,但我猜测它来自我的自定义着色器加载器而不是来自opengl限制.这里是我的简单顶点着色器的代码(它应该将笛卡尔坐标映射到球形坐标,其大小为583bytes):

#version 330 core

uniform mat4 projection;
uniform mat4 camera;

layout (location=0) in vec3 vertex;
layout (location=1) in vec4 color;

in mat4 object;

out vec4 vColor;

void main()
{
  float x=sqrt(max(1.0-0.5*pow(vertex.y,2)-0.5*pow(vertex.z,2)+pow(vertex.y*vertex.z,2)/3.0,0.0));
  float y=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.z,2)+pow(vertex.x*vertex.z,2)/3.0,0.0));
  float z=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.y,2)+pow(vertex.x*vertex.y,2)/3.0,0.0));
  gl_Position=projection*camera*object*vec4(x,y,z,1.0); 
  vColor=color;
} 
Run Code Online (Sandbox Code Playgroud)

和加载器的代码:

GLuint vs;
vs=glCreateShader(GL_VERTEX_SHADER);
std::ifstream vertexShaderStream(_vsPath);
vertexShaderStream.seekg(0,std::ios::end);
unsigned int vsSourceLen=(unsigned int)vertexShaderStream.tellg();
vertexShaderStream.seekg(0,std::ios::beg);
char vertexShaderSource[vsSourceLen];
vertexShaderStream.read(vertexShaderSource,vsSourceLen);
vertexShaderStream.close();

const char *vsConstSource(vertexShaderSource);
glShaderSource(vs,1,&vsConstSource,NULL);
glCompileShader(vs);
int status;
glGetShaderiv(vs,GL_COMPILE_STATUS,&status);
if(!status)
{
    char log[256];
    glGetShaderInfoLog(vs,sizeof log,NULL,log);
    std::cout << log << std::endl;
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

当我将大小减小到512字节以下(2 ^ 9 …

c++ opengl glsl vertex-shader shading

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

如何在不更改 ThreeJS 中材质的情况下为几何体提供顶点着色器?

我正在尝试使用顶点着色器修改一些几何图形,它基本上对几何图形的每个顶点应用某些线性变换,从而改变其形状。问题是我不知道如何用它启用 phong 照明和纹理。一旦我通过材质 API 传递顶点着色器,它就会自动呈现红色,并且一切看起来都是平坦的。看起来这里没有进行光照计算。请帮忙。

这是一个演示,我将顶点着色器应用到立方体。 https://jsfiddle.net/6593Lyve/4/

void main()
{
    vec3 p = position.xyz;
    float new_x = p.x*a11 + p.y*a12;
    float new_y = p.x*a21 + p.y*a22;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(new_x, new_y, p.z, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

graphics vertex-shader fragment-shader three.js

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