- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在鼠标单击的地方绘制一个 2D 三 Angular 形。已经制作了鼠标事件处理程序,并且可以看到鼠标单击的点。我在缓冲区对象中写入了三 Angular 形的顶点位置。它将是三 Angular 形大小。如何连接鼠标事件处理程序(功能单击)和三 Angular 形的位置(positionBuffer)你能给我答案吗?
//Vertex shader program
var VSHADER_SOURCE =
'attribute vec4 a_Position;\n' +
'void main() {\n' +
' gl_Position = a_Position;\n' +
'}\n';
// Fragment shader program
var FSHADER_SOURCE =
'void main() {\n' +
' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' +
'}\n';
function main() {
// Retrieve <canvas> element
var canvas = document.getElementById('webgl');
// Get the rendering context for WebGL
var gl = getWebGLContext(canvas);
if (!gl) {
console.log('Failed to get the rendering context for WebGL');
return;
}
// Initialize shaders
if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
console.log('Failed to intialize shaders.');
return;
}
var n = initVertexBuffers(gl);
if(n < 0){
console.log('Failed to set the positions of the vertices');
return;
}
// Register function (event handler) to be called on a mouse press
canvas.onmousedown = function(ev){ click(ev, gl, canvas) };
// Specify the color for clearing <canvas>
gl.clearColor(0.0, 0.0, 0.0, 1.0);
// Clear <canvas>
gl.clear(gl.COLOR_BUFFER_BIT);
}
var shapes = []; // The array for the position of Triangle with mouse click
function click(ev, gl, canvas) {
var x = ev.clientX; // x coordinate of a mouse pointer
var y = ev.clientY; // y coordinate of a mouse pointer
var rect = ev.target.getBoundingClientRect();
x = ((x - rect.left) - canvas.width/2)/(canvas.width/2);
y = (canvas.height/2 - (y - rect.top))/(canvas.height/2);
// Store the coordinates to shapes array
shapes.push([x,y]);
// Clear <canvas>
gl.clear(gl.COLOR_BUFFER_BIT);
var len = shapes.length;
for(var i = 0; i < len; i++) {
gl.bufferData(gl.ARRAY_BUFFER, shapes[i], gl.STATIC_DRAW);
}
// Draw
gl.drawArrays(gl.TRIANGLES, 0, 3);
}
//Make the BO for making triangle
function initVertexBuffers(gl){
var vertices = new Float32Array([
0.0, 0.1,
-0.1, -0.1,
0.1, -0.1,
]);
var n = 3;
//Create a buffer Object
var positionBuffer = gl.createBuffer();
if(!positionBuffer){
console.log('Failed to create the buffer object');
return -1;
}
//Bind the buffer object to target
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
//Write date into the buffer object
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
//Assign the buffer object to a_Position variable
var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
if (a_Position < 0) {
console.log('Failed to get the storage location of a_Position');
return -1;
}
//Connect the assignment to a_Position variable
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
//Enable the assignment to a_Position variable
gl.enableVertexAttribArray(a_Position);
return n;
}
错误信息->
最佳答案
目前还不清楚你想要发生什么。你想绘制一个包含多个三 Angular 形的网格还是想绘制N个三 Angular 形?
无论如何,这段代码没有任何意义
var shapes = []; // The array for the position of Triangle with mouse click
function click(ev, gl, canvas) {
...
// Store the coordinates to shapes array
shapes.push([x,y]);
...
var len = shapes.length;
for(var i = 0; i < len; i++) {
gl.bufferData(gl.ARRAY_BUFFER, shapes[i], gl.STATIC_DRAW);
}
gl.bufferData
需要 typed array ,而不是您传递给它的 JavaScript native 数组数组。
但也不清楚你想做什么。在 initVertexBuffer
您创建一个缓冲区并上传一个三 Angular 形(3 个顶点)
然后在 click
您尝试用点数据替换位置缓冲区中的三 Angular 形,如果成功,将删除该三 Angular 形。它不成功,因为您没有使用类型化数组,但即使成功,它也不起作用,因为您最终会删除三 Angular 形。
可以说,确实存在太多错误,无法真正选择一个起点。我建议reading some other tutorials on WebGL
这是您的代码,可以正常工作
我添加了制服u_Offset
到顶点着色器。然后我循环遍历 click
中的形状坐标,将每个记录的偏移量设置为 gl.uniform2f
并调用gl.drawArrays
对于每个三 Angular 形。
//Vertex shader program
var VSHADER_SOURCE = `
attribute vec4 a_Position;
uniform vec2 u_Offset;
void main() {
gl_Position = a_Position + vec4(u_Offset, 0, 0);
}`;
// Fragment shader program
var FSHADER_SOURCE = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}`;
var offsetLoc;
function main() {
// Retrieve <canvas> element
var canvas = document.getElementById('webgl');
// Get the rendering context for WebGL
var gl = canvas.getContext("webgl");
if (!gl) {
console.log('Failed to get the rendering context for WebGL');
return;
}
// Initialize shaders
if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
console.log('Failed to intialize shaders.');
return;
}
offsetLoc = gl.getUniformLocation(gl.program, "u_Offset");
var n = initVertexBuffers(gl);
if(n < 0){
console.log('Failed to set the positions of the vertices');
return;
}
// Register function (event handler) to be called on a mouse press
canvas.onmousedown = function(ev){ click(ev, gl, canvas) };
// Specify the color for clearing <canvas>
gl.clearColor(0.0, 0.0, 0.0, 1.0);
// Clear <canvas>
gl.clear(gl.COLOR_BUFFER_BIT);
}
var shapes = []; // The array for the position of Triangle with mouse click
function click(ev, gl, canvas) {
var x = ev.clientX; // x coordinate of a mouse pointer
var y = ev.clientY; // y coordinate of a mouse pointer
var rect = ev.target.getBoundingClientRect();
x = ((x - rect.left) - canvas.width/2)/(canvas.width/2);
y = (canvas.height/2 - (y - rect.top))/(canvas.height/2);
// Store the coordinates to shapes array
shapes.push([x,y]);
// Clear <canvas>
gl.clear(gl.COLOR_BUFFER_BIT);
var len = shapes.length;
for(var i = 0; i < len; i++) {
// Draw
gl.uniform2f(offsetLoc, shapes[i][0], shapes[i][1]);
gl.drawArrays(gl.TRIANGLES, 0, 3);
}
}
//Make the BO for making triangle
function initVertexBuffers(gl){
var vertices = new Float32Array([
0.0, 0.1,
-0.1, -0.1,
0.1, -0.1,
]);
var n = 3;
//Create a buffer Object
var positionBuffer = gl.createBuffer();
if(!positionBuffer){
console.log('Failed to create the buffer object');
return -1;
}
//Bind the buffer object to target
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
//Write date into the buffer object
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
//Assign the buffer object to a_Position variable
var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
if (a_Position < 0) {
console.log('Failed to get the storage location of a_Position');
return -1;
}
//Connect the assignment to a_Position variable
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
//Enable the assignment to a_Position variable
gl.enableVertexAttribArray(a_Position);
return n;
}
function initShaders(gl, vsrc, fsrc) {
// initShaders is really poorly designed. Most WebGL programs need multiple shader programs
// but this function assumes there will only ever be one shader program
// Also you should never assign values to the gl context.
gl.program = twgl.createProgram(gl, [vsrc, fsrc]);
gl.useProgram(gl.program);
return gl.program;
}
main();
canvas { border: 1px solid black; }
<canvas id="webgl"></canvas>
<script src="https://twgljs.org/dist/3.x/twgl.min.js"></script>
关于javascript - webGL通过鼠标点击绘制2D三 Angular 形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46768355/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!