标签: shader

android上的glCreateShader和glCreateProgram失败

我在android上创建着色器程序时遇到了一个非常困难的问题.当我调用glCreateShader或glCreateProgram时,每个都返回0.

我已经涵盖了有关故障排除的所有基础:

  • 我检查确保我有一个ogl上下文(我这样做,我通过清除各种颜色的帧缓冲区测试了这个,这是有效的).

  • 我尝试了glGetError,但没有返回任何内容(GL_NO_ERROR)

我不是一个opengl或android专家,所以我不知道其他任何可能造成这种情况的事情.

我一直在nexus 7平板电脑上运行我的应用程序,我使用的是OpenGL ES 2.0,我的目标是最新版本的Android(版本17).

最后,我还要显示我的代码:

这是我设置应用程序的样板代码:

public class Platform implements ILinkable<Activity> {
    class GameLoop extends GLSurfaceView implements GLSurfaceView.Renderer {
        class Graphics2D implements IGraphics2D {
            int width  = 0;
            int height = 0;

            public void setWidth (int width ) { this.width = width; }
            public void setHeight(int height) { this.height = height; }

            public int getWidth () { return width;  }
            public int getHeight() { return height; }
        }

        class Time implements ITime {
            float frametime …
Run Code Online (Sandbox Code Playgroud)

java shader android opengl-es-2.0 nexus-7

12
推荐指数
1
解决办法
8585
查看次数

如何在XNA中使用着色器为单个像素着色?

我的XNA项目中有一个标准的800x600窗口.我的目标是根据一个保持布尔值的矩形数组为每个像素着色.目前我正在使用1x1纹理并在我的数组中绘制每个精灵.

我是XNA的新手,来自GDI背景,所以我正在做我在GDI中所做的事情,但它不能很好地扩展.我在另一个问题中被告知要使用Shader,但经过大量研究后,我仍然无法找到如何实现这个目标.

我的应用程序循环遍历矩形数组的X和Y坐标,根据每个值进行计算,并重新分配/移动数组.最后,我需要用新值更新我的"画布".我的数组的一个较小的样本看起来像:

0,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0
1,1,1,1,1,1,1
1,1,1,1,1,1,1
Run Code Online (Sandbox Code Playgroud)

如何使用着色器为每个像素着色?

一个非常简化的计算版本是:

        for (int y = _horizon; y >= 0; y--)  // _horizon is my ending point
        {
            for (int x = _width; x >= 0; x--) // _width is obviously my x length.
            {
                if (grains[x, y] > 0)
                {
                    if (grains[x, y + 1] == 0)
                    {
                        grains[x, y + 1] = grains[x, y];
                        grains[x, y] = 0;
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

..每次调用更新方法,执行计算时,在上述循环的示例中,更新可能如下所示:

初始:

0,0,0,1,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0
1,1,1,0,1,1,1
1,1,1,1,1,1,1
Run Code Online (Sandbox Code Playgroud)

第一: …

c# shader xna

11
推荐指数
1
解决办法
2406
查看次数

如何在没有("<<"||">>")运算符的情况下有效地执行位移?

我正在开发一个OpenGL ES 2.0着色器,我有一个紧密打包的数据,例如在两个字节的块内有三个5位无符号整数.要解压缩这些数据,我显然需要进行位移,但OpenGL ES着色语言不支持此功能(参见第29页http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf)

因此,我执行了许多*2和/ 2操作来模拟位移.

有谁知道更有效/更优雅的方式来做到这一点?有没有我不知道的伎俩?

谢谢!

performance shader bit-manipulation opengl-es glsl

11
推荐指数
2
解决办法
9334
查看次数

GLSL对象发光

是否可以创建一个GLSL着色器来让任何对象被发光效果包围?假设我有一个3d立方体,如果它被选中,立方体应该被蓝色发光效果包围.任何提示?

opengl shader glsl

11
推荐指数
1
解决办法
1万
查看次数

GLES2 glBindAttribLocation()是否必要?

这可能是一个菜鸟问题.据我了解,只要AAA是唯一的,glBindAttribLocation(...,AAA,...)就会将程序中的属性绑定到AAA的位置ID.如果我有以下代码:

glBindAttribLocation(..., 0, "XXX");
glBindAttribLocation(..., 1, "YYY");
Run Code Online (Sandbox Code Playgroud)

这会将我的两个变量绑定到位置ID 0和1.然后我会调用:

glBindBuffer(GL_ARRAY_BUFFER, VBId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBId);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void *) 0 + sizeof(float) * 3);
glEnableVertexAttribArray(1);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我理解0和1的ID作为第一个参数传递给glVertexAttribPointer().

如果我通过glGetAttribLocation()调用获得属性的位置ID(如上所述),以便返回的ID是5和6而不是0和1,我是否可以安全地将5和6传递给glVertexAttribPointer( )和glEnableVertexAttribArray()而不是0和1 ??

shader vertex-buffer opengl-es-2.0

11
推荐指数
1
解决办法
3395
查看次数

WebGL中是否支持一维纹理?

我一直试图找到一个明确的答案,但似乎没有人明确提出这个问题.

我可以在WebGL Chrome,Firefox,Safari,IE等中使用1D采样器和1D纹理吗?

编辑

可以理解的是1确实是2的幂(2 ^ 0 = 1)意味着您可以有效地使用2D采样器和纹理,使用高度1和宽度256或512等来复制1D纹理.

1D纹理不是没有实际意义,它们的存在是因为它们不仅有目的,而且旨在转化为GPU本身的优化(而不是2D纹理).请记住,每个参数都需要时间加载到调用堆栈,几乎所有GPU编程都是优化每个可能操作的技术.

计算着色器经常需要单个浮动列表而没有额外的维度,使用1D纹理和采样器提供了强类型提供的相同清晰度.即,在1D结构中表示1D数据,并且在2D结构中表示2D数据.它还删除了索引到行/列转换所需的额外操作.

问题不在于他们是否有充分理由,而是支持他们.

WebGL的1.0基于OpenGL ES 2.0的作为09/MAY/2014

  • 目前没有1D纹理或采样器支持.

shader glsl webgl fragment-shader glsles

11
推荐指数
2
解决办法
3130
查看次数

在OpenGL中进行深度测试的Z-fighting解决方案 - 它们如何工作?

描述

我在OpenGL中遇到了Z-Fighting的主要问题,我花了很长时间才找到解决这个问题的方法.我发现的一些,我理解并不喜欢:

  • 移动多边形彼此远离(如OpenGL中的glPolygonOffset)
  • 根据Z坐标划分场景,并使用单独的干净z缓冲区绘制场景的部分.

那些我不明白的:

我已经在我的程序中实现了第二个,只需将它放入球的顶点着色器(它与地面z-fight):

float C = 1.0; 
float far = 2000.0; 
   gl_Position = u_projView * a_position;      
gl_Position.z = 2.0*log(gl_Position.w*C + 1.0)/log(far*C + 1.0) - 1.0;
gl_Position.z *= gl_Position.w;
Run Code Online (Sandbox Code Playgroud)

它工作了!

实际问题

  1. 任何人都可以解释我是如何在顶点着色器中更改顶点的Z坐标解决了问题而没有将顶点明显地移动到我身上?(场景看起来与人眼相同).它是如何改变z深度值的分布的?我猜我错过了一些关于渲染管道的知识.
  2. 任何人都可以向我解释我们如何使用Projection Matrix来解决问题?它是如何工作的?
  3. 是否还有其他类似的有效方法来解决z-fighting问题?

谢谢!

opengl graphics shader rendering glsl

11
推荐指数
1
解决办法
3982
查看次数

使用OpenGL着色器模拟调色板交换(在LibGDX中)

我正在尝试使用LibGDX制作复古风格的小游戏,我想让玩家选择几个角色的颜色,所以我想加载png索引图像,然后以编程方式更新调色板...错了我是^^ U.

看起来颜色托盘已经成为过去,而且看起来实现类似结果的最佳选择是使用着色器.

这是一张图片,解释了我现在正在尝试的内容:

我想做什么

我的意图是使用2张图片.其中之一pixel_guy.png 是只有6种颜色的png图像(这些颜色是其原始调色板).另一个图像colortable.png是一个6x6像素的png,其中包含6个调色板,每个调色板有6种颜色(每行是不同的调色板).来自第一行像素colortable.png的颜色将匹配使用的颜色pixel_guy.png,即第一个/原始调色板,其他行将是调色板2到6.我尝试实现的是使用colortable的第一个调色板来索引像素颜色,然后通过向着色器发送一个数字(从2到6)来更改调色板.

在做了一些研究之后,我在gamedev stackexchange中发现了一个帖子,显然它正是我想要的,所以我试着测试它.

我创建了顶点和片段着色器并加载了我的纹理(我想要交换的调色板,以及包含多个调色板的调色板),但输出是一个意外的白色图像.

我的顶点着色器:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;

void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
}
Run Code Online (Sandbox Code Playgroud)

我的片段着色器:

    // Fragment shader
// Thanks to Zack The Human https://gamedev.stackexchange.com/questions/43294/creating-a-retro-style-palette-swapping-effect-in-opengl/

uniform sampler2D texture; // Texture to which we'll apply our shader? (should its name be …
Run Code Online (Sandbox Code Playgroud)

shader android opengl-es fragment-shader libgdx

11
推荐指数
1
解决办法
2460
查看次数

使用着色器将纹理像素移动到其中心

我试图随着时间的推移将平方纹理纹理像素移动到纹理的中心.下面的代码正在做它的工作,除非我希望像素在到达几何体的中心(一个平面)时消失,而现在它只是变得越来越小,而时间增加,纹理看起来像收缩.

在此输入图像描述

uniform float time;
varying vec2 vUv;

void main() {

    vec2 center = vec2(0.5, 0.5);
    vec2 newPosition = vec2(vUv.x + t * (center.x - vUv.x), vUv.y + t * (center.y - vUv.y);

    gl_FragColor = texture2D( texture, vec2(newPosition.x, newPosition.y) );
}
Run Code Online (Sandbox Code Playgroud)

编辑:

把它想象成纹理中心的黑洞. 在此输入图像描述

opengl shader glsl webgl

11
推荐指数
1
解决办法
667
查看次数

样本,像素和片段之间有什么区别?

我仍然无法理解样本/像素/片段之间的差异.

由于片段着色器按像素执行,我认为片段只是指一个像素,这是正确的吗?谁能给我一个例子和每个人的定义?

opengl shader

11
推荐指数
2
解决办法
4076
查看次数