У меня есть код, который отображает 2D-спрайты на экране. Все работает; но координаты текстуры указаны в диапазоне 0,0 - 1,1
. Я хотел бы указать координаты в пикселях, чтобы при создании спрайта я мог предоставить часть листа спрайтов для рендеринга в пикселях (в противном случае, если мой лист спрайтов когда-либо изменит размер, мне нужно будет заново рассчитать все локации, что не кажется нормальным).
// IDEAL SPRITE INIT CODE
var player = new Sprite(
position: new Vector2.zero(),
velocity: new Vector2.zero(),
size: new Vector2(128.0, 128.0) // Rendered size in world-units
texture: player2Texture,
textureOffset: new Vector2.zero(), // Offset in spritesheet
textureSize: new Vector2(100, 100), // Size of section of spritesheet to render
);
Я мог бы передать здесь общий размер текстуры и разделить на него, чтобы получить числа в диапазоне 0-1, но я не вижу, дает ли мне Текстура в WebGL доступ к этому (и я не уверен, что это обычное дело).
Я пытаюсь сделать как можно больше вычислений в шейдере (полагаю, это логично, поскольку графические процессоры, как правило, быстрее, чем процессоры, но, как я уже сказал, я нуб, пожалуйста, укажите, если это глупо!) , и мои текущие шейдеры выглядят так:
# VERTEXT SHADER
uniform vec2 uResolution;
attribute vec2 aSpriteLocation;
attribute vec2 aSpriteSize;
attribute vec2 aVertexPosition;
attribute vec2 aTextureCoord;
attribute vec2 aTextureSize;
varying vec2 vTextureCoord;
varying vec2 vTextureSize;
void main() {
// Convert from screen coords to clipSpace (-1,-1 to 1,1)
vec2 clipSpace = (((aSpriteLocation + (aVertexPosition * aSpriteSize)) / uResolution) * 2.0) - 1.0;
// Flip upside down, so 0,0 is at the top of the screen!
clipSpace = clipSpace * vec2(1, -1);
gl_Position = vec4(clipSpace, 0.0, 1.0);
vTextureCoord = aTextureCoord;
vTextureSize = aTextureSize;
}
# FRAGMENT SHADER
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D uSampler;
varying vec2 vTextureCoord;
varying vec2 vTextureSize; # Currently this must be in the range 0,0 - 1,1; but I want to pass in texture pixels
void main() {
gl_FragColor = texture2D(uSampler, vTextureSize * vec2(vTextureCoord.s, vTextureCoord.t));
}
В настоящее время vTextureSize
, который попадает в мой фрагментный шейдер, работает в диапазоне 0,0 - 1,1
. Каков правильный способ предоставить пиксельные координаты для моей текстуры и где-то их сопоставить?
Я думал, что может быть общий/стандартный набор шейдеров, используемый для базового 2D-рендеринга, в котором уже есть набор юниформ/атрибутов, которые я мог бы просто предоставить, но я не смог его найти. Однако, если такие вещи существуют, я хотел бы знать (поскольку я даже не добрался до вращения, альфы, тонирования и других вещей, которые я мог бы захотеть сделать со спрайтами ;-))