Intereting Posts

Как передать правильные данные в шейдерную программу OpenGL-ES 2.0

У меня есть средство визуализации, которое является попыткой нарисовать точки как текстурированный квадрат. Ничего не сбивает, и у меня есть другие предметы, которые нарисованы в порядке, но эти квадраты не отображаются, я считаю, что это имеет какое-то отношение к данным, переданным в шейдерную программу в моей функции 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, 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, 0, mPointSize); GLES20.glEnableVertexAttribArray(mPointSizeHandle); // Pass in the position information geometryBuffer.position(0); GLES20.glVertexAttribPointer(mPointPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false, mPositionFloatStrideBytes, geometryBuffer); GLES20.glEnableVertexAttribArray(mPointPositionHandle); // Pass in the texture coordinate information mSquareTextureCoordinates.position(0); GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mVec2DataSize, GLES20.GL_FLOAT, false, 0, mSquareTextureCoordinates); GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); GLES20.glUniformMatrix4fv(mPointMVPMatrixHandle, 1, false, mMVPMatrix, 0); // Draw the cube. GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 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, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }; 

Именно так я устанавливаю квадратный размер (теперь он закодирован).

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

Будьте очень благодарны за помощь!

[EDIT] @ user2359247 ok Я понимаю, что вы имеете в виду, я сохраню его как единое целое, поэтому я изменил: mPointSizeHandle = GLES20.glGetUniformLocation (mPointsProgramHandle, "u_pointSize");

Не совсем уверен, как передать буфер, однако, я не сталкивался с этим раньше.

Другой дружественный вопрос: понимаете ли вы, чего я пытаюсь выполнить, я спрашиваю только, как мне интересно, есть ли в моем mPointSize-буфере правильные данные? Это решение для рендеринга точек как текстурированных квадратов исходило от кого-то другого, поэтому я пытаюсь собрать это вместе.

Поэтому я не понимаю, как установить значения переменной размера точки или какую функцию следует использовать для передачи ее в шейдер:

U_pointSize – это vec2 в нормализованных координатах устройства; Значение должно быть размером в пикселях, разделенным на размер окна просмотра в пикселях.

Пробовал обмен:

 mPointSize.position(0); GLES20.glVertexAttribPointer(mPointSizeHandle, mVec2DataSize, GLES20.GL_FLOAT, false, 0, mPointSize); //Error code gets sent back after this line. GLES20.glEnableVertexAttribArray(mPointSizeHandle); 

с

 GLES20.glUniform2fv(mPointSizeHandle, 1, mPointSize); 

Это поверхность на данный момент: Введите описание изображения здесь
Должен быть больше похож на этот макет: Введите описание изображения здесь

    Вы пытаетесь получить местоположение атрибута, в то время как размер точки равномерен:

     final String pointVertexShader = "uniform vec2 u_pointSize; 

     mPointSizeHandle = GLES20.glGetAttribLocation(mPointsProgramHandle, "u_pointSize"); 

    Либо измените размер точки на атрибут, либо используйте glGetUniformLocation.