我正在尝试在Android上学习OpenGL ES,但有一点让人感到非常沮丧和困难.我无法从GLSL编译器获得任何可用的错误消息.当你没有得到任何有用的反馈,学习GLSL,除了"它编译"和"它不编译"是相当困难的.
我发现glGetProgramInfoLog
应该包含来自编译器的错误,但我唯一可以解决的问题就是这样
由于无效的片段着色器,链接失败.
我使用正确的命令来获取编译器错误,还是我应该使用不同的命令?是否有可能从GLSL编译器获得更有意义的错误消息?
我在Android 4.3和Nexus 10上使用OpenGL ES 3.0作为目标.
我试图在iPhone上为OpenGL ES应用程序编写一个简单的顶点着色器,但是我的数组构造函数给我带来了麻烦.
attribute vec4 normal;
attribute vec4 position;
void main(void){
const vec4 vertices[3] = vec4[](vec4(0.25, -0.25, 0.5, 1.0),
vec4(-0.25, -0.25, 0.5, 1.0),
vec4(0.25, 0.25, 0.5, 1.0));
gl_Position = vertices[gl_VertexID];
}
Run Code Online (Sandbox Code Playgroud)
使用此代码时,着色器无法编译,并向我提供了以下错误消息:
错误:0:13:'(':语法错误:数组大小必须出现在变量名后面
我想知道,是否有可能mipmap深度纹理.如果,是的,它将如何工作,并使用它.
搜索很多,但在任何地方都没有得到很好的解释.
我无法将 sampler2d 统一从我的代码传递到着色器。我的着色器中有这一行:
uniform sampler2D u_texture;
Run Code Online (Sandbox Code Playgroud)
在代码中,我使用在搅拌机中创建的 g3db 模型(带纹理):
AssetManager assets = new AssetManager();
assets.load(data+"/earth.g3db", Model.class);
assets.finishLoading();
Model earthModel = assets.get(data+"/earth.g3db", Model.class);
earthPlanet = new ModelInstance(earthModel,0,-1,0);
Run Code Online (Sandbox Code Playgroud)
我使用modelBatch渲染它:
modelBatch.begin(cam);
modelBatch.render(earthPlanet, shader);
modelBatch.end();
Run Code Online (Sandbox Code Playgroud)
我的代码中有着色器类,其中有一个渲染方法:
public void render(Renderable renderable) {
program.setUniformMatrix(u_worldTrans, renderable.worldTransform);
//how to pass texture??
//program.setUniformf(sampler2D, ????);
renderable.mesh.render(program,
renderable.primitiveType,
renderable.meshPartOffset,
renderable.meshPartSize);
}
Run Code Online (Sandbox Code Playgroud)
我会很高兴得到任何回应。谢谢!
我写了一个着色器,使用 3ds max 生成的法线贴图。我在windows上得到了无缝结果 ,但我在 mac 上看到了接缝。这可能与我开发法线贴图的方向有关(但我再次相信我在 opengl 模式下运行 chrome),还是某种精度问题?有没有没有mac的调试方法?
根据下面的 gmans 回答,我已添加
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
Run Code Online (Sandbox Code Playgroud)
链接在这里。
如果这是一个愚蠢的问题,我很抱歉,但我很长一段时间都在想为什么那里有很多例子顶点着色器,包含一个模型视图矩阵.在我的程序中,我有以下情况:
如果我在顶点着色器中使用模型视图矩阵,我必须在CPU上执行矩阵乘法并上传单个矩阵.另一种方法是上传模型和视图矩阵并在GPU上进行乘法运算.关键是,视图矩阵不一定与模型矩阵同时发生变化,但如果使用模型视图矩阵,则只要其中任何一个发生变化,就必须执行CPU乘法和上传.那么为什么不使用单独的视图和模型矩阵来实现快速GPU乘法,并且可能大致相同数量的GPU矩阵上传?
我知道如果某个uniform
变量没有主动为管道输出做出贡献,那么它会被优化并返回-1.考虑下面的片段着色器.
const char fShader[] = "precision mediump float; \n"
"uniform float uGlobalTime; \n"
"const int iMaxIterations = 6; \n"
"float fCircleSize = 1.0 / (3.0 * pow(2.0, float(iMaxIterations))); \n"
"vec2 Rotate(vec2 uv, float a) \n"
"{ \n"
"return vec2(uv.x * cos(a) - uv.y * sin(a), uv.y * cos(a) + uv.x * sin(a)); \n"
"} \n";
"void main() \n"
"{ \n"
"vec2 uv = vec2(1280.0, 720.0); \n"
"uv = -0.5 * (uv - 2.0 * gl_FragCoord.xy) / uv.x; \n" …
Run Code Online (Sandbox Code Playgroud) 我正在使用 GLES 2.0 ( http://maninara.blogspot.com/2012/09/render-camera-preview-using-opengl-es.html )渲染相机预览。它工作得很好,直到我从其他地方复制了一些 GLSL 着色器代码并注意到它不起作用并且我收到此错误:
error C7502: OpenGL does not allow type suffix 'f' on constant literals in versions below 120
Run Code Online (Sandbox Code Playgroud)
因此,要查看问题是否出自我复制的着色器代码,我将顶点着色器示例(请参见上面的链接)中的这一行从
gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0, 1.0 )
Run Code Online (Sandbox Code Playgroud)
到
gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0f, 1.0f )
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到同样的错误。我已经通过输出 GLES20.glGetString(GLES20.GL_SHADING_LANGUAGE_VERSION) 来确认 GLSL 的版本足够高,它给出:
GLSL Version = OpenGL ES GLSL ES 3.10
Run Code Online (Sandbox Code Playgroud)
我是否错误地设置了 OpenGL ES 上下文?这里发生了什么?
更新:如果我添加“#version 120”,我会收到这个错误:
error C0201: unsupported version 120
Run Code Online (Sandbox Code Playgroud) 我正在 OpenGL ES 2.0 中为 android 编写一个应用程序,但我遇到了一些着色器代码的问题。这里是:
attribute vec4 vPosition;
vec4 tempPosition;
void main() {
tempPosition = vPosition;
tempPosition.x = 2 - tempPosition.x;
gl_Position = tempPosition.yxzw;
}
Run Code Online (Sandbox Code Playgroud)
导致错误的行是这一行:
tempPosition.x = 2 - tempPosition.x;
Run Code Online (Sandbox Code Playgroud)
每次我想绘制一些东西时,我都会启用和禁用顶点 atrrib 数组。在我画画之前我称之为:GLES20.glEnableVertexAttribArray(sPosition);
在我画画之后,我称之为
GLES20.glDisableVertexAttribArray(sPosition);
我究竟做错了什么?如何从 2 中减去 x?
编辑:
如果我将导致错误的行更改为:
tempPosition.xz = vec2(2,0) - tempPosition.xz;
Run Code Online (Sandbox Code Playgroud)
比它有效,但为什么我不能用单个数字减去?
SubpassInput 由片段着色器隐式寻址。我想用我自己的纹理坐标处理输入。类似于纹理(采样器,texCoord)