2015-07-19 5 views
0

Мне нужно сделать некоторые большие оптимизации в моей игре, и я думал, так как мы можем передать цвет vec4 в шейдер, упакованный только на один плавающий, есть способ передать текстуру vec2 координаты тоже? Например, в следующем коде я могу передать 2 текстурных координаты (всегда 1 и 0) только как один элемент, так же, как это происходит в цветовом элементе.OpenGL передает упакованные текстурные координаты в шейдер

public void point(float x,float y,float z,float size,float color){ 
    float hsize=size/2; 
    if(index>vertices.length-7)return; 
    vertices[index++]=x-hsize; 
    vertices[index++]=y-hsize; 
    vertices[index++]=color; 
    vertices[index++]=0; 
    vertices[index++]=0; 

    vertices[index++]=x+hsize; 
    vertices[index++]=y-hsize; 
    vertices[index++]=color; 
    vertices[index++]=1; 
    vertices[index++]=0; 

    vertices[index++]=x+hsize; 
    vertices[index++]=y+hsize; 
    vertices[index++]=color; 
    vertices[index++]=1; 
    vertices[index++]=1; 

    vertices[index++]=x-hsize; 
    vertices[index++]=y+hsize; 
    vertices[index++]=color; 
    vertices[index++]=0; 
    vertices[index++]=1; 

    num++; 
} 
{ 
    mesh=new Mesh(false,COUNT*20, indices.length, 
      new VertexAttribute(Usage.Position, 2,"a_position"), 
      new VertexAttribute(Usage.ColorPacked, 4,"a_color"), 
      new VertexAttribute(Usage.TextureCoordinates, 2,"a_texCoord0") 
    ); 
} 

осколочная шейдер

varying vec4 v_color; 
varying vec2 v_texCoords; 
uniform sampler2D u_texture; 

void main() { 
    vec4 color=v_color * texture2D(u_texture, v_texCoords); 
    gl_FragColor = color; 
} 

верт шейдер

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec2 a_texCoord0; 

uniform mat4 u_projTrans; 

varying vec4 v_color; 
varying vec2 v_texCoords; 

void main() { 
    v_color = a_color; 
    v_texCoords = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

Я знаю, что это не будет делать большую разницу в производительности, но я просто хочу, чтобы провести некоторые дополнительные часов здесь и там, чтобы сделать эту небольшую оптимизацию, чтобы моя игра работала быстрее.

ответ

1

Я не пробовал, но думаю, что это сработает. Просто используйте Usage.ColorPacked для ваших координат текстуры. Я не думаю, что вы можете отправить что-либо меньше 4 байтов, поэтому вы можете использовать уже определенный упакованный цвет. Вы будете сохранять только один байт на вершину. Вы можете поместить свои координаты в первые два элемента и игнорировать два вторых элемента.

mesh = new Mesh(false,COUNT*20, indices.length, 
     new VertexAttribute(Usage.Position, 2,"a_position"), 
     new VertexAttribute(Usage.ColorPacked, 4,"a_color"), 
     new VertexAttribute(Usage.ColorPacked, 4,"a_texCoord0") 
); 

Я не думаю, что параметр VertexAttribute usage фактически используется либо в Libgdx. Если вы посмотрите на исходный код, он проверяет, только если usage будет ColorPacked или нет, и от того, решает ли использовать один байт на каждый компонент по сравнению с 4

И в вашей вершинного шейдера:

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec4 a_texCoord0; //note using vec4 

uniform mat4 u_projTrans; 

varying vec4 v_color; 
varying vec2 v_texCoords; 

void main() { 
    v_color = a_color; 
    v_texCoords = a_texCoord0.xy; //using the first two elements 
    gl_Position = u_projTrans * a_position; 
} 

Для того, чтобы перевести текстуры правильно скоординировать:

final Color texCoordColor = new Color(0, 0, 0, 0); 

//.... 

texCoordColor.r = texCoord.x; 
texCoordColor.g = texCoord.y; 
float texCoord = texCoordColor.toFloatBits(); 
+0

работы !, Интересно, почему libgdx не по умолчанию используется подстройка, как это по крайней мере в SpriteBatch после текстурных координат спрайта не изменяется очень предлагает, вероятно, прирост производительности не является существенным, а его чем-то. – SteveL

+0

В SpriteBatch есть много кода, который зависит от его конкретного размера вершины и назначений атрибутов для оптимизации. В TextureAtlases любого значительного размера низкая точность одного байта для U и V будет недостаточной. Для вас мало того, что вы не используете TextureRegions из TextureAtlas, где вам действительно не нужна точность UV. – Tenfour04

+0

Я вижу, и я был готов возиться с источником SpriteBatch и TextureRegion, чтобы сделать это, и я полностью забыл о точности потерь. Я использую TextureAtlase во всем остальном, и выше это просто эффект свечения вокруг некоторых объектов (возможно, 400- 500 объектов, таких как частицы). Спасибо за твой собеседник. – SteveL

Смежные вопросы