当前位置: 首页 > 知识库问答 >
问题:

GLSL vars转换问题从ShaderToy到Android Studio GLSL

李泓
2023-03-14

我想要一个非常简单的解释,为什么这些变量在“Android Studio”上不起作用,以及如何解决我的问题(一些用于“TheeBookOfShaders”,一些用于“Atom”,另一些用于两者,一些仅用于“ShaderToy”,一些仅用于“Android Studio”)。

*为了真正理解,这是一个示例(来自“fragment.glsl”文件)*

uniform vec2 resolution;     // [-] work on...
uniform vec2 uresolution;    // [-] work on...
uniform vec2 iresolution;    // [Y] work only on "ShaderToy"
uniform vec2 u_resolution;   // [Y] work on "Atom" and "WebGL"

i、 e.*从“ShaderToy”到“Atom”的示例转换(实时编码)*

uniform vec2 iresolution;    // is used on: "ShaderToy"
uniform vec2 u_resolution;   // is used on: "Atom", "WebGL", etc.

所以:[iresolution=u_resolution]*好的,它可以工作*

*那么,现在,为什么在“Android Studio”(java code fragment.glsl)中,这些都不起作用呢*

   uniform vec2 resolution;     // doesn't work on "Android Studio"
   uniform vec2 uresolution;    // doesn't work on "Android Studio"
   uniform vec2 iresolution;    // doesn't work on "Android Studio"
   uniform vec2 u_resolution;   // doesn't work on "Android Studio"
   uniform vec2 vresolution;    // doesn't work on "Android Studio"
   uniform vec2 v_resolution;   // doesn't work on "Android Studio"

显然:

   vec2 A = (gl_FragCoord.xy / u_resolution);     // doesn't work on "Android Studio"
   vec2 A = (gl_FragCoord.xy / uresolution);      // doesn't work on "Android Studio"
   vec2 A = (gl_FragCoord.xy / *SOME*resolution); // doesn't work on "Android Studio"

等。

时间变量的情况也一样:时间、utime、u_时间、itime、vtime、v_时间、全局时间等。

*在哪里可以找到在“Android Studio”GLSL着色器文件中使用RESOLUTION/TIME/其他人system-var的确切关键字?*

>

“分辨率”是否为系统库变量?

“解析”有没有一个简单的最终真实方案来理解这种混乱中的一些东西?

  • Atom编辑器-“u_分辨率”使用

在这个示例中,我们可以看到Xresolution的唯一工作版本——在家试用

  • 原子编辑器-“其他分辨率”使用

在另一个示例中,我们可以看到Xresolution的所有其他黄色故障版本-在家试用

“fragment.glsl”测试文件在Atom编辑器上100%可用(请在家里试用)

#ifdef GL_ES
    precision highp float;
#endif

uniform vec2 resolution;    // not-system var
uniform vec2 uresolution;   // not-system var
uniform vec2 iResolution;   // system-var WORK 100% on ShaderToy
uniform vec2 vresolution;   // not-system var
uniform vec2 u_resolution;  // system-var WORK 100% on Atom-Editor but NOT on Android Studio
uniform vec2 i_resolution;  // not-system var
uniform vec2 v_resolution;  // not-system var

void main()
{
    vec2 A = (gl_FragCoord.xy / u_resolution);

    gl_FragColor = vec4(A.x, A.y, 0.0, 1.0);
}

*解决方案|仅在ANDROID STUDIO上100%工作*

#ifdef GL_ES
    precision highp float;
#endif

uniform vec2 u_resolution; // note: you can name it also "Pacman"...
                           // this mode let you can to create your
                           // personal var-name to access to windows view-port

void main()
{
    // ---------------------------------------------------------------------------------
    u_resolution = vec2(1920, 1080); // this assignment work 100% ONLY on Android Studio
    // ---------------------------------------------------------------------------------

    // --------------------------------------------------------------------------
    vec2 A = (gl_FragCoord.xy / u_resolution);                      // solution 1
    vec2 A = (gl_FragCoord.xy / vec2(1920, 1080));                  // solution 2
    vec2 A = (vec2(gl_FragCoord.x / 1920, gl_FragCoord.y / 1080));  // solution 3
    // --------------------------------------------------------------------------

    gl_FragColor = vec4(A.x, A.y, 0.0, 1.0);
}

最终我们找到了解决方案,总是摆在眼前。我们从一个窗口开始,其中X和Y的尺寸设置为1920x1080(在我们的例子中,我们不需要任何其他东西),我指出了设置变量“u_分辨率”的三种模式。警告-此功能仅适用于Android Studio,并且能够回答我的上述问题。问题已经解决了。费利佩通过参与表明了他解决问题的决心。当然,我们也可以通过Java或C或其他方式从主代码设置这个值;但对我们来说,在这篇文章中,唯一有趣的是通过GLSL直接设置/检索这些“u_分辨率”。

采用的解决方案完美满足出发需求,希望对所有后来者有所帮助3线解决方案等价:选择你的首选

特别感谢@felipe gutierrez的友好合作。

共有2个答案

叶冥夜
2023-03-14

根据Khronos网站:“A

如果您想测试您是否拥有正确的i分辨率制服,那么您可以键入:

void main()
{

    vec2 uv = gl_FragCoord.xy/u_resolution;

    vec3 col = vec3( smoothstep( 0.1, 0.1 - 0.005, length( uv - 0.5 ) ) );

    gl_FragColor = vec4( col, 1 );

}
霍鸣
2023-03-14

您提到的GLSL变量都不是系统变量

它们是用户组成的变量。

uniform vec2 resolution;

绝对没有更多的意义比;

uniform vec2 foobar;

这些是您选择的变量。

你可以通过查找它们的位置来设置它们

在WebGL/JavaScript中

const resolutionLocation = gl.getUniformLocation(someProgram, "resolution");
const foobarLocation = gl.getUniformLocation(someProgram, "foobar");

在爪哇

int resolutionLocation = GLES20.glGetUniformLocation(mProgram, "resolution");
int foobarLocation = GLES20.glGetUniformLocation(mProgram, "foobar");

您可以在WebGL/JavaScript中设置它们

gl.useProgram(someProgram);  
gl.uniform2f(resolutionLocation, yourVariableForResolutionX, yourVariableForResolutionY);
gl.uniform2f(foobarLocation, yourVariableForFoobarX, yourVariableForFoobarY);

还是Java

GLES20.glUseProgram(someProgram);  
GLES20.glUniform2f(resolutionLocation, yourVariableForResolutionX, yourVariableForResolutionY);
GLES20.glUniform2f(foobarLocation, yourVariableForFoobarX, yourVariableForFoobarY);

没有神奇的系统变量,它们是应用程序的100%变量iResolution是ShaderToy的程序员编写的一个变量u_resolution是Atom插件作者编写的一个变量。他们可以很容易地选择renderizegamenHirosa(日语的屏幕宽度)或任何东西。同样,它们不是系统变量,而是程序员选择的变量。在你的应用程序中,你也可以自行设置变量。

我建议你阅读一些关于WebGL的教程

 类似资料:
  • 我开始尝试将列表结构转换为字典,但遇到了一些麻烦。我正在修改我的前述语句<代码> 我现在用字典卡在这一行:

  • 好的,我的问题对于任何玩过棋盘游戏编程的人来说都应该很熟悉,所以这里是: 我实现了MiniMax算法的一种变体(返回移动而不是最小/最大值) 我还尝试将其设置为alpha beta版,尽管最终完全失败 这是我的极大极小码: 有什么想法吗?如何调整上述内容,使其成为Alpha Beta搜索? 下面是我尝试的Alpha-Beta转换(失败得很惨): 提示(以避免任何误解): > 此- 和分别被定义为一

  • 问题内容: 这是我的问题:鉴于这些课程 此代码编译: 并且这不: 是什么赋予了? 更新: 此代码可在Java 8中编译。显然是由于“改进的类型推断”。 问题答案: 在第一个示例中,调用的推断类型为,显然可以将其分配给相同类型的变量。 在第二个示例中,右侧的类型为。虽然 是 分配给, 不 分配给。它可以分配给。 其原因与a 不可分配给的原因相同。如果是这样,它将使以下(非类型安全的)代码成为可能:

  • 问题内容: 我有一个要转换为SSIS程序包中PRN的Excel文件。我的问题。我的一列中有货币,所有内容都应带有小数点,但并非所有数字都具有小数点。例如,如果没有毛钱,它只会读为10425。我需要在SSIS中进行的操作是使读为10425.00,就像文件中的其他数字一样。 请帮忙。 问题答案: 您可以使用“派生列”转换来转换数据类型。我认为Currency(DT_CY)数据类型不会强制您使用小数位,

  • 我有这种格式的数据: 100 1 2 3 4 5 我使用以下代码来加载它: 我想从数组[Int]生成对,这样一个值大于一个数(在下面的代码中为2)的数组元素就可以与数组的所有其他元素配对。然后我会用它来生成更多的统计数据。例如,对于示例数据,我应该能够首先生成: 100 (3,1), (3,2), (3,4), (3,5),(4,1), (4,2), (4,3), (4,5) 下面是我得到的o/p

  • 我正在将我的应用程序从C2DM转换为GCM,我有一些问题。 我修改了这里的gcmquickstart示例: 在我的类,扩展应用程序,我有: 好的,这将启动服务,并且它将永远运行,或者如果操作系统关闭它,那么操作系统将重新启动它。对吗? CheckPlayServices()确保这是Android 2.3或更高版本,并且安装了Google Play Services,因为这些是使用GCM的唯一要求。