mirror of
https://github.com/zellyn/apple2shader.git
synced 2025-02-19 14:30:39 +00:00
webgl: more drawDisplayCanvas
This commit is contained in:
parent
b1de44181e
commit
f7e6a41322
101
screenEmu.js
101
screenEmu.js
@ -667,6 +667,7 @@ void main(void)
|
||||
this.imageWhiteLevel = null;
|
||||
this.imageSubcarrier = null;
|
||||
this.viewportSize = new Size(0, 0);
|
||||
this.persistenceTexRect = new Rect(0, 0, 0, 0);
|
||||
|
||||
this.configurationChanged = true;
|
||||
this.imageChanged = true;
|
||||
@ -1278,6 +1279,106 @@ void main(void)
|
||||
canvasSize.height *
|
||||
this.display.videoSize.height);
|
||||
|
||||
let barrelTexRect;
|
||||
|
||||
// Render
|
||||
let texture;
|
||||
if (displayShader)
|
||||
texture = this.textures["IMAGE_DECODED"];
|
||||
else
|
||||
texture = this.textures["IMAGE_IN"];
|
||||
|
||||
// Set uniforms
|
||||
if (displayShader)
|
||||
{
|
||||
gl.useProgram(displayShader);
|
||||
|
||||
// Texture
|
||||
const texSize = texture.size;
|
||||
|
||||
gl.uniform1i(gl.getUniformLocation(displayShader, "texture"), 0);
|
||||
gl.uniform2f(gl.getUniformLocation(displayShader, "textureSize"),
|
||||
texSize.width, texSize.height);
|
||||
|
||||
// Barrel
|
||||
barrelTexRect = new Rect(-0.5, -0.5 / displayAspectRatio,
|
||||
1.0, 1.0 / displayAspectRatio);
|
||||
gl.uniform2f(gl.getUniformLocation(displayShader, "barrelSize"),
|
||||
1, 1.0 / displayAspectRatio);
|
||||
|
||||
// Scanlines
|
||||
const scanlineHeight = canvasVideoSize.height / this.image.height;
|
||||
let scanlineLevel = this.display.displayScanlineLevel;
|
||||
|
||||
scanlineLevel = ((scanlineHeight > 2.5) ? scanlineLevel :
|
||||
(scanlineHeight < 2) ? 0 :
|
||||
(scanlineHeight - 2) / (2.5 - 2) * scanlineLevel);
|
||||
|
||||
gl.uniform1f(gl.getUniformLocation(displayShader, "scanlineLevel"), scanlineLevel);
|
||||
|
||||
// Shadow mask
|
||||
let shadowMaskTexture;
|
||||
let shadowMaskAspectRatio;
|
||||
switch (this.display.displayShadowMask)
|
||||
{
|
||||
case "SHADOWMASK_TRIAD":
|
||||
shadowMaskTexture = this.textures["SHADOWMASK_TRIAD"];
|
||||
shadowMaskAspectRatio = 2 / (274.0 / 240.0);
|
||||
break;
|
||||
case "SHADOWMASK_INLINE":
|
||||
shadowMaskTexture = this.textures["SHADOWMASK_INLINE"];
|
||||
shadowMaskAspectRatio = 2;
|
||||
break;
|
||||
case "SHADOWMASK_APERTURE":
|
||||
shadowMaskTexture = this.textures["SHADOWMASK_APERTURE"];
|
||||
shadowMaskAspectRatio = 2;
|
||||
break;
|
||||
case "SHADOWMASK_LCD":
|
||||
shadowMaskTexture = this.textures["SHADOWMASK_LCD"];
|
||||
shadowMaskAspectRatio = 2;
|
||||
break;
|
||||
case "SHADOWMASK_BAYER":
|
||||
shadowMaskTexture = this.textures["SHADOWMASK_BAYER"];
|
||||
shadowMaskAspectRatio = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
const shadowMaskDotPitch = this.display.displayShadowMaskDotPitch;
|
||||
|
||||
if (shadowMaskDotPitch <= 0.001)
|
||||
shadowMaskDotPitch = 0.001;
|
||||
|
||||
const shadowMaskElemX = (displayResolution.width /
|
||||
this.display.displayPixelDensity *
|
||||
25.4 * 0.5 / shadowMaskDotPitch);
|
||||
const shadowMaskSize = new Size(shadowMaskElemX,
|
||||
shadowMaskElemX * shadowMaskAspectRatio /
|
||||
displayAspectRatio);
|
||||
|
||||
gl.activeTexture(gl.TEXTURE1);
|
||||
|
||||
gl.bindTexture(gl.TEXTURE_2D, shadowMaskTexture.glTexture);
|
||||
|
||||
gl.uniform2f(gl.getUniformLocation(displayShader, "shadowMaskSize"),
|
||||
shadowMaskSize.width, shadowMaskSize.height);
|
||||
|
||||
// Persistence
|
||||
gl.activeTexture(gl.TEXTURE2);
|
||||
|
||||
gl.bindTexture(gl.TEXTURE_2D, this.textures["IMAGE_PERSISTENCE"].glTexture);
|
||||
|
||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
||||
|
||||
gl.activeTexture(gl.TEXTURE0);
|
||||
|
||||
gl.uniform1i(gl.getUniformLocation(displayShader, "persistence"), 2);
|
||||
gl.uniform2f(gl.getUniformLocation(displayShader, "persistenceOrigin"),
|
||||
this.persistenceTexRect.x, this.persistenceTexRect.y);
|
||||
gl.uniform2f(gl.getUniformLocation(displayShader, "persistenceSize"),
|
||||
this.persistenceTexRect.width, this.persistenceTexRect.height);
|
||||
}
|
||||
|
||||
// TODO(zellyn): implement
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user