顶点纹理提取(在顶点着色器中读取纹理)

时间:2016-05-26 11:13:11

标签: android opengl-es glsl

Opengl和GLSL的新手。

我正在使用 OpenGL es 3.0 我的GLSL版本#version 300 es

我希望在我的顶点着色器(顶点纹理提取)中的每个位置获取像素(ARGB数据)。我已经确认我的Android平板电脑支持顶点纹理提取。

现在我将纹理(图像)和纹理坐标传递给顶点着色器 并执行

GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);

这是正确的方式还是我应该使用GL_POINTS。 如果我使用GL_POINTS如何传递纹理coordinated?

你能提供在顶点着色器中进行全像素读取(ARGB)的任何样本/示例代码吗?

附加我的顶点着色器

uniform sampler2D sTexture; 
in vec4 aTextureCoord;
out vec3 colorFactor;
vec2 vTextureCoord;
vec4 tex;
void main() 
{
   vTextureCoord = aTextureCoord.xy;
   tex =  texture(sTexture,vTextureCoord);
   float luminance = 0.299 * tex.r + 0.587 * tex.g + 0.114 * tex.b;
   colorFactor = vec3(1.0, 1.0, 1.0);
   gl_Position = vec4(-1.0 + (luminance * 0.00784313725), 0.0, 0.0,      1.0); 
   gl_PointSize = 1.0;
};

我传递的纹理坐标是      {0.f,1.F}
     {1.f,1.f} {0.f,0.f}  {1.F,0.f}

并且着色器由

触发
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);

2 个答案:

答案 0 :(得分:0)

只需声明一个采样器并按照惯例对其进行完全采样。 E.g。

"#version 150\n"

in vec4 position;
in vec2 texCoordinate;

uniform sampler2D texID;
uniform mat4 modelViewProjection;

void main()
{
    gl_Position = modelViewProjection * (position + texture(texID, texCoordinate));
}

这将从位置texID处的纹理单元texCoordinate中采样4d向量,在应用模型 - 视图 - 投影矩阵之前使用它来扰动position。您绘制的几何体类型没有区别。

答案 1 :(得分:0)

  

gl_Position = vec4(-1.0 +(亮度* 0.00784313725),0.0,0.0,1.0);

那很聪明。它不会工作,但那很聪明。

让每个人感到困惑的是你没有告诉我们的事情。您使用混合计算直方图。您可以根据亮度计算每个片段的位置,从而获得大量重叠。混合只会将所有内容组合在一起,从而产生直方图。

仅供参考:总是最好解释一下你在你的问题中实际想要完成什么,而不是希望有人可以推断出你试图做的事情。

这不起作用,因为在这种情况下你只有四个顶点。你有很多碎片,但它们将基于4个顶点的插值生成。并且您无法在片段着色器中更改片段的位置。

如果你想做你想做的事情,你仍然需要为你获取的每个纹素渲染一个顶点。您仍然需要使用GL_POINTS