Colors 片段着色器vColor未更改,glUniform4f集合上出现1282错误
使用Colors 片段着色器vColor未更改,glUniform4f集合上出现1282错误,colors,opengl-es,operation,Colors,Opengl Es,Operation,使用glUniform4f更改片段着色器的vColor时,我面临着色器1282代码问题。我没花多少时间,但毫无头绪。需要帮助的请 我的程序的目标是为三角形使用不同的颜色,但不能使用glUniform应用颜色。更改glUniformam时出现无效操作错误 public class BuildCanvas { private final String vertexShaderCode = "attribute vec4 vPosition;" + "void main()
glUniform4f
更改片段着色器的vColor
时,我面临着色器1282代码问题。我没花多少时间,但毫无头绪。需要帮助的请
我的程序的目标是为三角形使用不同的颜色,但不能使用glUniform
应用颜色。更改glUniform
am时出现无效操作错误
public class BuildCanvas
{
private final String vertexShaderCode =
"attribute vec4 vPosition;" +
"void main() {" +
" gl_Position = vPosition;" +
"}";
private final String fragmentShaderCode =
" precision mediump float; " +
" uniform vec4 vColor; " +
" void main() { " +
" gl_FragColor = vColor; " +
" } ";
int vertexShader;
int fragmentShader;
int mProgram;
FloatBuffer vertexBuffer;
float[] color;
static final int COORDS_PER_VERTEX = 2;
static final int TRIANGLE_VERTEX_CNT =3;
int initShaders()
{
// prepare shaders and OpenGL program
int vertexShader = MyGLRenderer.loadShader(
GLES20.GL_VERTEX_SHADER, vertexShaderCode);
MyGLRenderer.checkGlError("vertexShaderCode");
int fragmentShader = MyGLRenderer.loadShader(
GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
MyGLRenderer.checkGlError("fragmentShaderCode");
mProgram = GLES20.glCreateProgram(); // create empty OpenGL Program
MyGLRenderer.checkGlError("glCreateProgram");
GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program
MyGLRenderer.checkGlError("vertexShader");
GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
MyGLRenderer.checkGlError("fragmentShader");
GLES20.glLinkProgram(mProgram); // create OpenGL program executables
MyGLRenderer.checkGlError("glLinkProgram");
return 0;
}
int fillData(Shape shape)
{
int vertexCnt = shape.listPoints.size() *COORDS_PER_VERTEX;
drawingType eType = shape.eType;
float[] data ;
int dataIdx =0;
data = new float[ COORDS_PER_VERTEX * shape.listPoints.size()];
//Log.e("OpenGL", "shape.listPoints.size():" + shape.listPoints.size());
for(int idx=0;idx<shape.listPoints.size();idx++)
{
data[dataIdx++] = shape.listPoints.get(idx).xPos;
data[dataIdx++] = shape.listPoints.get(idx).yPos;
}
// initialize vertex byte buffer for shape coordinates
ByteBuffer bb = ByteBuffer.allocateDirect(
// (number of coordinate values * 4 bytes per float)
dataIdx * 4);
// use the device hardware's native byte order
bb.order(ByteOrder.nativeOrder());
// create a floating point buffer from the ByteBuffer
vertexBuffer = bb.asFloatBuffer();
// add the coordinates to the FloatBuffer
vertexBuffer.put(data, 0, dataIdx);
// set the buffer to read the first coordinate
vertexBuffer.position(0);
return 0;
}
int draw()
{
int mPositionHandle;
int mColorHandle;
// get handle to vertex shader's vPosition member
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
MyGLRenderer.checkGlError("mPositionHandle");
// Enable a handle to the triangle vertices
GLES20.glEnableVertexAttribArray(mPositionHandle);
// get handle to fragment shader's vColor member
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
MyGLRenderer.checkGlError("mColorHandle");
// Prepare the triangle coordinate data
GLES20.glVertexAttribPointer(
mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
0, vertexBuffer);
// Set color for drawing the triangle
// GLES20.glUniform4fv(mColorHandle, 1, color, 0);
// MyGLRenderer.checkGlError("mColorHandle");
float rgba[] ={0.0f,1.0f,1.0f,0.0f};
for(int i=0;i<vertexBuffer.capacity()/(TRIANGLE_VERTEX_CNT*COORDS_PER_VERTEX);i++)
{
/********************************************/
/********************************************/
/***********On uncommenting following 2 lines am getting shader error 1282 ***********/
//GLES20.glUniform4f(mColorHandle,rgba[0],rgba[1],rgba[2],rgba[3]);
//MyGLRenderer.checkGlError("mColorHandle");
// Draw the triangle
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, i*TRIANGLE_VERTEX_CNT, TRIANGLE_VERTEX_CNT);
}
// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);
//GLES20.glDisableVertexAttribArray(mColorHandle);
return 0;
}
}
公共类BuildCanvas
{
私有最终字符串vertexShaderCode=
“属性向量4位置;”+
“void main(){”+
“gl_位置=V位置;”+
"}";
私有最终字符串碎片ShaderCode=
“精密中泵浮动;”+
“统一vec4彩色;”+
“void main(){”+
“gl_FragColor=vColor;”+
" } ";
int顶点着色器;
int片段着色器;
内部程序;
浮动缓冲区顶点缓冲区;
浮动[]颜色;
每个顶点的静态最终整数坐标=2;
静态最终整数三角形\顶点\ CNT=3;
int initShaders()
{
//准备着色器和OpenGL程序
int vertexShader=MyGLRenderer.loadShader(
GLES20.GL_顶点着色器,vertexShaderCode);
MyGLRenderer.checklerror(“vertexShaderCode”);
int fragmentShader=MyGLRenderer.loadShader(
GLES20.GL_FRAGMENT_着色器,fragmentShaderCode);
checkleror(“fragmentShaderCode”);
mProgram=GLES20.glCreateProgram();//创建空的OpenGL程序
MyGLRenderer.checklerror(“glCreateProgram”);
GLES20.glAttachShader(mProgram,vertexShader);//将顶点着色器添加到程序中
MyGLRenderer.checklerror(“顶点着色器”);
GLES20.glAttachShader(mProgram,fragmentShader);//将片段着色器添加到程序中
checklerror(“fragmentShader”);
GLES20.glLinkProgram(mProgram);//创建OpenGL程序可执行文件
MyGLRenderer.checklerror(“glLinkProgram”);
返回0;
}
int fillData(形状)
{
int vertexCnt=shape.listPoints.size()*每个顶点的坐标;
drawingType eType=shape.eType;
浮动[]数据;
int dataIdx=0;
数据=新浮点[COORDS_PER_VERTEX*shape.listPoints.size()];
//Log.e(“OpenGL”、“shape.listPoints.size():”+shape.listPoints.size());
对于(int idx=0;idxy您错过了将程序对象安装为当前呈现状态的一部分()。添加GLES20.glUseProgram(mProgram);
在GLES20.glLinkProgram(mProgram);
之后和GLES20.glUniform4vf(…)
之前。谢谢您rabbi76…在这一行更改之后…一切看起来都很好。向您致敬