标签: glsles

如何获得更有用的GLSL编译错误?

我正在尝试在Android上学习OpenGL ES,但有一点让人感到非常沮丧和困难.我无法从GLSL编译器获得任何可用的错误消息.当你没有得到任何有用的反馈,学习GLSL,除了"它编译"和"它不编译"是相当困难的.

我发现glGetProgramInfoLog应该包含来自编译器的错误,但我唯一可以解决的问题就是这样

由于无效的片段着色器,链接失败.

我使用正确的命令来获取编译器错误,还是我应该使用不同的命令?是否有可能从GLSL编译器获得更有意义的错误消息?

我在Android 4.3和Nexus 10上使用OpenGL ES 3.0作为目标.

android opengl-es glsles

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

如何在GLSL ES中编写const数组

我试图在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:'(':语法错误:数组大小必须出现在变量名后面

opengl-es glsl ios glsles

3
推荐指数
2
解决办法
4263
查看次数

我们可以mipmap深度纹理吗?

我想知道,是否有可能mipmap深度纹理.如果,是的,它将如何工作,并使用它.

搜索很多,但在任何地方都没有得到很好的解释.

opengl-es opengl-es-2.0 glsles

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

将“uniform sampler2D”传递给 libgdx 中的 glsl 着色器(使用 modelBatch)

我无法将 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)

我会很高兴得到任何回应。谢谢!

shader android opengl-es libgdx glsles

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

三.js 法线贴图渲染方式不同 windows/mac

我写了一个着色器,使用 3ds max 生成的法线贴图。我在windows上得到了无缝结果 ,但我在 mac 上看到了接缝。这可能与我开发法线贴图的方向有关(但我再次相信我在 opengl 模式下运行 chrome),还是某种精度问题?有没有没有mac的调试方法?

根据下面的 gmans 回答,我已添加

gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
Run Code Online (Sandbox Code Playgroud)

链接在这里

webgl法线贴图接缝

textures webgl three.js glsles

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

为什么是modelview矩阵?

如果这是一个愚蠢的问题,我很抱歉,但我很长一段时间都在想为什么那里有很多例子顶点着色器,包含一个模型视图矩阵.在我的程序中,我有以下情况:

  • 投影矩阵几乎没有变化(例如在应用程序窗口的大小调整上)并且它是分开的,这很好,
  • 模型矩阵经常变化(例如模型上的变换),
  • 视图矩阵也经常变化(例如改变观看方向,四处移动......).

如果我在顶点着色器中使用模型视图矩阵,我必须在CPU上执行矩阵乘法并上传单个矩阵.另一种方法是上传模型和视图矩阵并在GPU上进行乘法运算.关键是,视图矩阵不一定与模型矩阵同时发生变化,但如果使用模型视图矩阵,则只要其中任何一个发生变化,就必须执行CPU乘法和上传.那么为什么不使用单独的视图和模型矩阵来实现快速GPU乘法,并且可能大致相同数量的GPU矩阵上传?

opengl glsl glsles

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

glGetUniformLocation为USED变量返回-1,带有优化的地狱

我知道如果某个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)

opengl opengl-es fragment-shader glsles

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

Android 上的 OpenGL ES GLSL 着色器未加载正确版本?

我正在使用 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)

android opengl-es glsl glsles

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

GLSL 错误:绘制调用中未启用顶点属性

我正在 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)

比它有效,但为什么我不能用单个数字减去?

android glsl vertex-shader opengl-es-2.0 glsles

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

有没有办法在 Vulkan 中解决 subpassInput 问题?

SubpassInput 由片段着色器隐式寻址。我想用我自己的纹理坐标处理输入。类似于纹理(采样器,texCoord)

glsles vulkan

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