我在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) 我的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)
第一: …
我正在开发一个OpenGL ES 2.0着色器,我有一个紧密打包的数据,例如在两个字节的块内有三个5位无符号整数.要解压缩这些数据,我显然需要进行位移,但OpenGL ES着色语言不支持此功能(参见第29页http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf)
因此,我执行了许多*2和/ 2操作来模拟位移.
有谁知道更有效/更优雅的方式来做到这一点?有没有我不知道的伎俩?
谢谢!
是否可以创建一个GLSL着色器来让任何对象被发光效果包围?假设我有一个3d立方体,如果它被选中,立方体应该被蓝色发光效果包围.任何提示?
这可能是一个菜鸟问题.据我了解,只要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 ??
我一直试图找到一个明确的答案,但似乎没有人明确提出这个问题.
我可以在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
我在OpenGL中遇到了Z-Fighting的主要问题,我花了很长时间才找到解决这个问题的方法.我发现的一些,我理解并不喜欢:
那些我不明白的:
我已经在我的程序中实现了第二个,只需将它放入球的顶点着色器(它与地面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)
它工作了!
谢谢!
我正在尝试使用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) 我试图随着时间的推移将平方纹理纹理像素移动到纹理的中心.下面的代码正在做它的工作,除非我希望像素在到达几何体的中心(一个平面)时消失,而现在它只是变得越来越小,而时间增加,纹理看起来像收缩.

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)
编辑:
把它想象成纹理中心的黑洞.

我仍然无法理解样本/像素/片段之间的差异.
由于片段着色器按像素执行,我认为片段只是指一个像素,这是正确的吗?谁能给我一个例子和每个人的定义?