如何通过 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 没有。但两者都无法初始化着色器
几天来我一直在尝试使用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。什么可能导致这种情况?
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 是否做了一些特殊的事情?
我对 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) 我在 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
我刚刚开始学习 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) 我正在尝试编写一个着色器来为 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,但结果似乎都在视图空间中。有谁知道如何根据其表面的方向为几何体着色?
我需要一个采用 3 种输入颜色并产生噪声的着色器,如下所示。借助“噪声纹理”和“颜色渐变”节点,在 Blender 中很容易实现。
我找到了这个 gist,这可能会解决我的问题。但我无法配置颜色。而且噪音看起来比 Blender 中的结果“更锐利”。
我需要为此编写自己的着色器还是有更简单的方法来使用 ThreeJS 实现这种效果?
考虑我的着色器程序。
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)