用着色器编写第一个程序

我们用着色编写画一个三角形

#include<Gl/glew.h>
//#include<gl/glxew.h>
#include<Gl/gl.h>
#include<GL/GLU.h>
#include<Gl/glut.h>
#include<stdio.h>
#include<malloc.h>
#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtx/transform.hpp>
using  glm::vec3;
using  glm::vec4;
void render()
{
	GLenum err = glewInit();
	if (GLEW_OK != err)
		fprintf(stderr, "error initializaing GLew %s\n", glewGetErrorString(err));
	GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
	const GLchar *codearray[] = {
		"#version 430                      \n"
		"in vec3 VertexPosition;        \n"
		"in vec3 VertexColor;             \n"
		"out vec3 Color ;\n"
		" void main()                   \n"
		"{                                \n"
		"	Color = VertexColor;                  \n"
		"	gl_Position = vec4(VertexPosition, 1.0);           \n"
		"}              \n"

	};
	glShaderSource(vertShader, 1, codearray, NULL);
	glCompileShader(vertShader);
	GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
	const GLchar* codearray_frag[] = {
		"#version    430                         \n"
		"in vec3 Color;                         \n"
		"out vec4 FragColor;                    \n"
		"void  main()                           \n"
		"{                                      \n"
		"FragColor=vec4(Color,1.0);             \n"
		"}                                      \n"
	};
	glShaderSource(fragShader, 1, codearray_frag, NULL);
	glCompileShader(fragShader);
	GLuint programHandle = glCreateProgram();
	if (0 == programHandle)
	{
		fprintf(stderr, "error creating program \n");
		exit(0);
	}
	glAttachShader(programHandle, vertShader);
	glAttachShader(programHandle, fragShader);
	glBindAttribLocation(programHandle, 0, "VertexPosition");
	glBindAttribLocation(programHandle, 1, "VertexColor");
	GLuint vaoHandle;
	float positionData[] = {
		-0.8f, -0.8f, 0.0f,
		0.8f, -0.8f, 0.0f,
		0.0f, 0.8f, 0.0f
	};
	float colorData[] = {
		1.0f, 0.0f, 0.0f,
		0.0f, 1.0f, 0.0f,
		0.f, 0.0f, 1.0f
	};
	GLuint vboHandle[2];
	glGenBuffers(2, vboHandle);
	GLuint positionbufferHandle = vboHandle[0];
	GLuint colorBufferHandle = vboHandle[1];
	glBindBuffer(GL_ARRAY_BUFFER, positionbufferHandle);
	glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), positionData, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
	glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), colorData, GL_STATIC_DRAW);
	glGenVertexArrays(1, &vaoHandle);
	glBindVertexArray(vaoHandle);
	glEnableVertexAttribArray(0);
	glEnableVertexAttribArray(1);
	glBindBuffer(GL_ARRAY_BUFFER, positionbufferHandle);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
	glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
	glBindVertexArray(vaoHandle);
	//	glDrawArrays
	glDrawArrays(GL_TRIANGLES, 0, 3);
	glLinkProgram(programHandle);

	GLint result;
	glGetShaderiv(programHandle, GL_COMPILE_STATUS, &result);
	if (GL_FALSE == result)
	{
		fprintf(stderr, "vertex shader compilation failed\n");
		GLint loglen;
		glGetProgramiv(programHandle, GL_LINK_STATUS, &loglen);
		if (loglen > 0)
		{
			char*log = (char*)malloc(loglen);
			GLsizei written;
			glGetProgramInfoLog(programHandle, loglen, &written, log);
			fprintf(stderr, "shader log:%s\n", log);
			free(log);
		}
	}
	else
	{
		;//	glUseProgram(programHandle);
	}
	glUseProgram(programHandle);
	/*
	const	GLubyte*renderer = glGetString(GL_RENDER);
	const	GLubyte *vendor = glGetString(GL_VENDOR);
	const	GLubyte *version = glGetString(GL_VERSION);
	const	GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
	GLint major, minor;
	glGetIntegerv(GL_MAJOR_VERSION, &major);
	glGetIntegerv(GL_MINOR_VERSION, &minor);
	printf("GL vendor:%s\n", vendor);
	printf("GL renderer:%s\n", renderer);
	printf("GL version(s):%s\n", version);
	printf("GL version(d):%d,%d\n", major,minor);
	printf("GL version:%s\n", glslVersion);

	*/
	;

}
int main(int argc, char**argv)
{

	glutInit(&argc, argv);

	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutCreateWindow("ss");

	glutDisplayFunc(render);

	glutMainLoop();
	return 0;
	//vec3 VertexPosition = vec3(1, 0,  1.0f);
	//vec3 VertexColor = vec3(1.0f, 0, 0)	;

	//return 0;
}

时间: 2024-10-06 10:19:21

用着色器编写第一个程序的相关文章

用Lazarus编写第一个程序Pascal版的hello world

安装 Lazarus的过程不用多说,都是傻瓜式的. 打开Lazarus,Lazarus会自动新建一个窗口形式的应用程序.你会看到五个窗口. 主窗口 这个窗口显示有标题栏.菜单栏和工具栏. 对象视图窗口 这个窗口显示创建的窗体和窗体的属性信息 源代码编辑窗口 这个窗口用来查看和编辑源代码 消息窗口 这个窗口显示编译运行的相关信息 默认创建的Form1窗口 这个是新建Application自动创建的 好了,介绍这么多,下面进入正题. 先关掉主窗口以外的四个窗口.关闭Form1时可能会提示,点No 1

c#小灶——使用visual studio编写第一个程序

虽然,写程序有文本编辑器和编译器就已经足够,但是,我们为了增加工作效率还是要使用IDE. 我们接下来所有的教程都将会在visual studio中实现,visual studio简称vs,是微软开发的一款IDE软件,使用这款软件,可以使开发效率事半功倍. 软件在哪里下载呢?首先推荐官网:https://visualstudio.microsoft.com/zh-hans/vs/ 这里有最新版本的vs下载,需要注意的是,vs有三个版本,分别是社区版.专业版.和企业版,推荐下载社区版,因为社区版是免

用Objective-C编写第一个程序——Hello,World!

无论是哪一个程序员,或者是学习哪一门计算机语言,写的第一个程序基本上就是Hello World.今天我们用OC来实现第一个程序:Hello World. 在Xcode中选择新建一个项目,在对话框中选择OS X,下方选择Application, 右侧选择Command line tool,表示使用的是命令行程序,点击Next:在下一个对话框中输入项目名称,并选择开发语言,可以看到在这里可以选择Swift,OC,C++,C语言:最后就是选择工作空间目录,直接点击Create就可以创建项目了. 创建项

Android学习笔记(第一篇)编写第一个程序Hello World+Activity

  PS:实验室里就我一个搞Android的,像人家学习J2EE的,还有人带着去学,我这样没人带的就只能自己摸爬滚打了,也总算是把大部分的基础算是学完了,终于开始正式的搞Android了...无人带的一介菜鸟,我还是自己默默的努力吧... 学习内容: 1.编写第一个Hello World程序..   学习Android,那么就需要有一个编译器来集成这个环境,然后在搭建好环境的编译器上进行开发就可以了,我所介绍的都是在Eclipse上来进行Android的开发...环境搭建在这里我就不进行介绍了.

PyQt5(2)——调整布局(布局管理器)第一个程序

我们拖拽一个UI文件,转为PY文件后生成一个类Ui_MainWindow 此时,我们新建一个文件,用来控制业务逻辑(继承界面中的类),跟界面分开,这样我们就完成了界面和逻辑相分离(这段代码使用率基本100%,牢牢记住). 1 __author__ = "WSX" 2 import sys 3 from PyQt5.QtWidgets import QApplication, QMainWindow 4 from first import * #导入了Ui_MainWindow类 5 6

利用python编写第一个程序

print("Hello world") 原文地址:https://www.cnblogs.com/Run1997/p/10230418.html

编写Unity3D着色器的三种方式

不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed function shader vertex and fragment shader surface shader 为什么Unity3D要提供三种shader的编写方式呢?那是因为三种方式的编写的难易度有区别,对应着不同的使用人群.其实我觉得这是Uniy3D想得有点多了,着色器不单止是为了实现效果,

第4章:缓冲区、着色器、GLSL

原文链接: http://www.rastertek.com/gl40tut04.html Tutorial 4: Buffers, Shaders, and GLSL This tutorial will be the introduction to writing vertex and pixel shaders in OpenGL 4.0. It will also be the introduction to using vertex and index buffers in OpenG

OpenGL学习日记-2015.3.5——Hello glsl(着色器)

过年前忍不住买了本新版的OpenGL编程指南,主要的目的还是为了系统的学习着色器编程,另外就是接触新版的OpenGL技术和思想.看了几页,就过年了QAQ.回来后也是各种不在状态,不想上班,不想工作,不想写代码...昨天终于强迫自己继续看书,也找回了些状态. 书本基础知识的全面性和权威性就不用说了,不过这个源代码就....这第一个例子照着代码来抄结果...我想应该是原来的代码一个参数错了,折腾了半天,代码分析是详说.主要是分析代码,有什么说什么,并没有全面的说明着色器的基本内容,想着在着色器的基础