gpt4 book ai didi

android - OpenGL ES 2.0 无法正确分配颜色属性

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:29 24 4
gpt4 key购买 nike

我在为我的几何图形应用颜色时遇到了一些困难。当我直接在顶点着色器中指定它时 ("varColor = vec4(1.0, 0.5, 0.4, 1.0);") - 一切正常。但是,如果我使用“vColor”属性中的颜色值 - 一切都会变得一团糟。

(添加了一些屏幕截图以显示我的意思)

有人可以帮我弄清楚我做错了什么,或者给我指出正确的方向吗?谢谢。

使用“varColor = vec4(1.0, 0.5, 0.4, 1.0);” Using "varColor = vec4(1.0, 0.5, 0.4, 1.0);"

使用“varColor = vColor” Using "varColor = vColor"

顶点着色器:

precision mediump float;

uniform mat4 modelViewProjectionMatrix;

attribute vec4 vPosition;
attribute vec2 vTexCoord;
attribute vec4 vColor;

varying lowp vec4 varColor;
varying mediump vec2 varTexCoord;

void main()
{
gl_Position = modelViewProjectionMatrix * vPosition;
varTexCoord = vTexCoord;
// varColor = vColor;
varColor = vec4(1.0, 0.5, 0.4, 1.0);
}

fragment 着色器:

precision mediump float;

uniform sampler2D Texture0;

varying vec4 varColor;
varying vec2 varTexCoord;

void main()
{
gl_FragColor = texture2D(Texture0, varTexCoord) * varColor;
}

着色器链接后,我将像这样绑定(bind)我的属性:

mMatrixMVP = glGetUniformLocation(mProgramId, "modelViewProjectionMatrix");

glBindAttribLocation(mProgramId, 0, "vPosition");
glBindAttribLocation(mProgramId, 1, "vTexCoord");
glBindAttribLocation(mProgramId, 2, "vColor");

mTexture = glGetUniformLocation(mProgramId, "Texture0");
glUniform1i(mTexture, 0);

保存我的顶点信息的结构:

struct Vertex
{
float xyz[3];
float st[2];
unsigned char color[4]; // All assigned to value of 255
};

渲染时,绑定(bind)顶点缓冲区后,我将像这样设置顶点属性:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, xyz));

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, st));

glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, color));

glActiveTexture(GL_TEXTURE0);
pTexture->Bind(); // Just a "glBindTexture(GL_TEXTURE_2D, mTextureId);"
glUniform1i(mpCurrentShader->GetTexture(), 0);

在此之后,我将绑定(bind)索引缓冲区并调用“glDrawElements”。

然后,调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 并使用“glDisableVertexAttribArray”禁用所有属性,最后 - 调用 glBindBuffer(GL_ARRAY_BUFFER, 0);

最佳答案

您需要在链接着色器程序之前调用glBindAttribLocation()

如果您链接程序时未使用 glBindAttribLocation() 或着色器代码中的 layout 限定符指定属性位置,则将自动分配属性位置当着色器程序被链接时。如果在链接程序后调用 glBindAttribLocation(),新位置只有在再次链接着色器程序时才会生效。

关于android - OpenGL ES 2.0 无法正确分配颜色属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23858879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com