PDA

Просмотр полной версии : Текстура рисуется повернутой на 180*


incvizitor
19.11.2012, 04:40
var code:String = "";
code += "mov op, va0\n";
code += "mov v1, va0\n";

var vertexShader:ByteArray = assembler.assemble(Context3DProgramType.VERTEX, code);

code = "";
code += "tex ft0, v1, fs0 <2d,clamp,linear>\n";
code += "mov oc, ft0";

var fragmentShader:ByteArray = assembler.assemble(Context3DProgramType.FRAGMENT, code);
program.upload(vertexShader, fragmentShader);

Вот вроде ж как самая простая программа, какая только может быть для отображения картинок. Но нет, почему то рисует картинку перевернутой :(

Sintesis
19.11.2012, 16:20
UV координаты есть в модели на которую текстуру налаживаешь? Если есть, разверни их в 3D редакторе на 180* или картинку текстуры в фотошопе разверни на 180*

incvizitor
19.11.2012, 21:15
да не, я любую картинку скармливаю, и получаю перевернутую. причем старлинг то же самое хавает норм.
Ну может в другом чем то проблема, к счастью исходние не большой.


package {
import com.adobe.utils.AGALMiniAssembler;
import com.adobe.utils.PerspectiveMatrix3D;
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.display3D.Context3D;
import flash.display3D.Context3DBlendFactor;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DTextureFormat;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.textures.Texture;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
import flash.utils.ByteArray;
import flash.utils.setTimeout;
import meshes.IndexTemplate;
import meshes.Poligon;

/**
* ...
* @author vaukalak
*/
public class Main extends Sprite {

private var _context:Context3D;
private var _poligon:Poligon;

private const _poligons:Vector.<Poligon> = new Vector.<Poligon>();
private var position:Vector3D;
private var indexBuffer:IndexBuffer3D;

[Embed(source = "../lib/live_start.png")]
public var textureAsset:Class;

public function Main():void {
stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, _onInit);
stage.stage3Ds[0].requestContext3D();

}

private function _onInit(e:Event):void {
_context = stage.stage3Ds[0].context3D;
_context.configureBackBuffer(stage.stageWidth, stage.stageHeight, 0);
_context.setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA);
var texture:Texture = _context.createTexture(128, 128, Context3DTextureFormat.BGRA, false);
var bitmap:Bitmap = new textureAsset() as Bitmap;
texture.uploadFromBitmapData(bitmap.bitmapData, 0);
_context.setTextureAt(0, texture);


var program:Program3D = _context.createProgram();
var assembler:AGALMiniAssembler = new AGALMiniAssembler();

var code:String = "";
code += "mov op, va0\n";
code += "mov v1, va0\n";

var vertexShader:ByteArray = assembler.assemble(Context3DProgramType.VERTEX, code);

code = "";
code += "tex ft0, v1, fs0 <2d,clamp,linear>\n";
code += "mov oc, ft0";

var fragmentShader:ByteArray = assembler.assemble(Context3DProgramType.FRAGMENT, code);
program.upload(vertexShader, fragmentShader);


var vertixes:Vector.<Number> = new <Number>[
-1, -1,
1, -1,
1, 1,
-1, 1,
];
var vertexBuffer:VertexBuffer3D = _context.createVertexBuffer(4, 2);
vertexBuffer.uploadFromVector(vertixes, 0, vertixes.length / 2);
_context.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);


var indexes:Vector.<uint> = new <uint>[0,1,2,2,3,1];
indexBuffer = _context.createIndexBuffer(indexes.length);
indexBuffer.uploadFromVector(indexes, 0, indexes.length);

_context.setProgram(program);

addEventListener(Event.ENTER_FRAME, _onEnterFrame);

}

private function _onEnterFrame(e:Event):void {
_context.clear(1, 1, 1, 1);
_context.drawTriangles(indexBuffer);
_context.present();
}

}

Волгоградец
20.11.2012, 11:26
Принято UV координаты указывать в диапазоне [0, 1], у тебя же они [-1, 1] и в сэмплере установлен clamp - т.е. часть текстуры будет обрезаться. А переворачивается она потому что в stage3D ось y указывает вверх, а не вниз как во флэше - отсюда и зеркальное отражение по этой оси. Да и вообще, ты рисуешь вершины против часовой стрелки и получается, отображаешь заднюю сторону треугольника.

incvizitor
20.11.2012, 15:09
блин, 3 косяка в 100 строках ))) спасибо тебе!

Волгоградец
20.11.2012, 16:09
Ну тогда вдогонку - vertex во множественном числе - vertices или vertexes )))