Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将正确的数据传递给OpenGL-ES 2.0着色器程序Android大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个渲染器,它试图将点绘制为纹理方块.什么都没有崩溃,我有其他项目被绘制得很好,但这些方块没有被渲染,我相信它与我的drawTexturedPoint()函数中传递给着色器程序的数据有关.

我有一个FloatBuffer geometryBuffer,它保存顶点位置. 6个顶点具有完全相同的顶点坐标,一个用于两个三角形的每个角.此缓冲区中有多个点.

着色器程序获取这些顶点并根据传递给着色器的点(或方形)大小将它们操作到正确的位置.

protected String getPointVertexShader()
{
    // Define a simple shader program for our points.
    final String pointVertexShader =
    "uniform vec2 u_pointSize;  
    + "uniform mat4 u_MVPMatrix;            \n"     
    + "attribute vec4 a_Position;               \n"
    + "attribute vec2 a_TexCoordinate;          \n"

    + "varying vec2 v_TexCoordinate;            \n" // Passed into the fragment shader.

    + "void main()                                  \n"
    + "{                                                \n"
    + "   v_TexCoordinate = a_TexCoordinate;    \n" // Pass through the texture coordinate.
    + "   gl_Position = u_MVPMatrix * a_Position;       \n"     // gl_Position is a special variable used to store the final position.
    + "   gl_Position += vec4(gl_Position.w * u_pointSize * (a_TexCoordinate - vec2(0.5,0.5)),0);\n"
    + "}                                                \n";
    return pointVertexShader;
}

protected String getPointFragmentShader()
{
    final String pointFragmentShader = 
    "precision mediump float;       \n"
    + "uniform sampler2D u_Texture; \n" // The input texture.

    + "varying vec2 v_TexCoordinate;\n" // Interpolated texture coordinate per fragment.

    + "void main()                  \n" // The entry point for our fragment shader.
    + "{                            \n"
    + "   gl_FragColor = (texture2D(u_Texture,v_TexCoordinatE));\n"    // Pass the color directly through the pipeline.          
    + "}                            \n";
    return pointFragmentShader;
}

请注意,u_pointSize是规范化设备坐标中的vec2;该值应为以像素为单位的大小除以视口大小(以像素为单位).

下面是将数据传递到着色器并进行绘制的函数.

private void drawTexturedPoint(final FloatBuffer geometryBuffer)
{
    //GeometryBuffer holds all the points in one buffer.

    GLES20.glUseProgram(mPointsProgramHandlE);

    mPointSizeHandle = GLES20.glGetAttribLOCATIOn(mPointsProgramHandle,"u_pointSize");
    mPointMVPMatrixHandle = GLES20.glGetUniformLOCATIOn(mPointsProgramHandle,"u_MVPMatrix");
    mTextureUniformHandle = GLES20.glGetUniformLOCATIOn(mPointsProgramHandle,"u_Texture");
    mPointPositionHandle = GLES20.glGetAttribLOCATIOn(mPointsProgramHandle,"a_Position");
    mTextureCoordinateHandle = GLES20.glGetAttribLOCATIOn(mPointsProgramHandle,"a_TexCoordinate");

    // Pass in the texture coordinate information
    mPointSize.position(0);
    GLES20.glVertexAttribPointer(mPointSizeHandle,mVec2DataSize,GLES20.GL_FLOAT,false,mPointSizE);

    GLES20.glEnabLevertexAttribArray(mPointSizeHandlE);

    // Pass in the position information
    geometryBuffer.position(0);
    GLES20.glVertexAttribPointer(mPointPositionHandle,mPositionDataSize,mPositionFloatStrideBytes,geometryBuffer);

    GLES20.glEnabLevertexAttribArray(mPointPositionHandlE);

    // Pass in the texture coordinate information
    mSquareTextureCoordinates.position(0);
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle,mSquareTextureCoordinates);

    GLES20.glEnabLevertexAttribArray(mTextureCoordinateHandlE);


    GLES20.glUniformMatrix4fv(mPointMVPMatrixHandle,1,mMVPMatrix,0);

    // Draw the cube.
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES,geometryBuffer.capacity()/mPositionDataSizE);                               
}

以下是绘制函数中使用的一些其他相关变量

private final int mBytesPerFloat = 4;   
private final int mPositionOffset = 0;
private final int mPositionDataSize = 3;
private final int mPositionFloatStrideBytes = mPositionDataSize * mBytesPerFloat;
private FloatBuffer mPointSize;
private final int mVec2DataSize = 2;

//纹理坐标数据.

final float[] squareTextureCoordinateData =
{
    // Front face
    0.0f,0.0f,1.0f,0.0f
};

这是我设置方形大小的方式(现在硬编码).

float psize = 25f/480f;
mPointSize.position(0);
mPointSize.put(psizE);
mPointSize.put(psizE);
mPointSize.flip();

最有帮助的一些!

[编辑]
@ user2359247好的我明白了你的意思,我会保持它的统一,所以我改变了:@H_48_38@mPointSizeHandle = GLES20.glGetUniformLOCATIOn(mPointsProgramHandle,“u_pointSize”);

但是不太确定如何通过缓冲区,我之前没有遇到过这个问题.

一个友好的问题是,你明白我想要完成什么,我只是问,因为我想知道我的mPointSize缓冲区中是否有正确的数据?
将点作为纹理方块渲染的解决方案来自其他人,因此我试图将其拼凑在一起.
所以我真的不明白如何设置磅值变量值或应该使用什么类型的函数将它传递到着色器:

尝试交换:

@H_983_11@mPointSize.position(0); GLES20.glVertexAttribPointer(mPointSizeHandle,mPointSizE); //Error code gets sent BACk after this line. GLES20.glEnabLevertexAttribArray(mPointSizeHandlE);

GLES20.glUniform2fv(mPointSizeHandle,mPointSizE);

这是目前的表面:

应该更像这个模型:

解决方法

在点大小统一时,您正尝试获取属性位置:

final String pointVertexShader =
"uniform vec2 u_pointSize;

@H_983_11@mPointSizeHandle = GLES20.glGetAttribLOCATIOn(mPointsProgramHandle,"u_pointSize");

将点大小更改为属性或使用glGetUniformLOCATIOn.

大佬总结

以上是大佬教程为你收集整理的如何将正确的数据传递给OpenGL-ES 2.0着色器程序Android全部内容,希望文章能够帮你解决如何将正确的数据传递给OpenGL-ES 2.0着色器程序Android所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。