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);
答案 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
。