如何通过 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) 我开始接触 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 没有。但两者都无法初始化着色器
橙皮书第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代码?
[为完整起见,片段着色器只复制颜色]
我正在尝试实现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) 我正在尝试编译一个着色器,它正在一台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) 我正在开发一个基于着色器的简单游戏,当我的顶点着色器文件长大,它的大小达到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 …
我正在尝试使用顶点着色器修改一些几何图形,它基本上对几何图形的每个顶点应用某些线性变换,从而改变其形状。问题是我不知道如何用它启用 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)